Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cassert>
- #include <cmath>
- #include <ctime>
- #include <cstdio>
- #include <queue>
- #include <set>
- #include <map>
- #include <fstream>
- #include <cstdlib>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <numeric>
- #define mp make_pair
- #define pb push_back
- #define fi first
- #define se second
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define forn(i, n) for (int i = 0; i < (int)(n); ++i)
- #define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
- #define ford(i, n) for (int i = (int)((n) - 1); i >= 0; --i)
- #define fornn(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
- #define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)
- #define debugv(a) forn(i, a.size()) cerr << a[i] << ' '; cerr << '\n'
- template<class T>
- bool uin(T &a, T b) {
- if (a > b) {
- a = b;
- return true;
- }
- return false;
- }
- template<class T>
- bool uax(T &a, T b) {
- if (a < b) {
- a = b;
- return true;
- }
- return false;
- }
- using namespace std;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- typedef long long i64;
- typedef unsigned long long u64;
- typedef pair<i64, i64> pi64;
- typedef vector<i64> vi64;
- typedef vector<vi64> vvi64;
- typedef long double ld;
- typedef vector<ld> vld;
- typedef vector<vld> vvld;
- const int MAXN = 1000000 + 1;
- const i64 P = 1000000000 + 9;
- string s[3];
- i64 ways[MAXN][2][2];
- int precalc[28][28][28][3][3];
- int gets(const string &s, int i) {
- if (i >= (int)s.size()) return 0;
- if (s[i] == '?') return 27;
- return 1 + s[i] - 'a';
- }
- int comp(int a, int b) {
- if (a == b) return 0;
- if (a < b) return 1;
- return 2;
- }
- int combine(int a, int b) {
- if (a == 0) return b;
- return a;
- }
- void adds(i64 &x, i64 y) {
- x += y; x %= P;
- }
- int main() {
- ios::sync_with_stdio(false);
- #ifdef LOCAL_DEFINE
- freopen("input.txt", "rt", stdin);
- // freopen("output.txt", "wt", stdout);
- #endif
- forn(a, 28) forn(b, 28) forn(c, 28) {
- for (int ca = (a == 27 ? 1 : a); ca < (a == 27 ? 27 : a + 1); ++ca) {
- for (int cb = (b == 27 ? 1 : b); cb < (b == 27 ? 27 : b + 1); ++cb) {
- for (int cc = (c == 27 ? 1 : c); cc < (c == 27 ? 27 : c + 1); ++cc) {
- int f1 = comp(ca, cb), f2 = comp(cb, cc);
- ++precalc[a][b][c][f1][f2];
- }
- }
- }
- }
- int N;
- cin >> N;
- forn(i, N) {
- forn(j, 3) cin >> s[j];
- int K = 0;
- forn(j, 3) K = max(K, (int)s[j].size());
- forn(i, K + 1) forn(j, 2) forn(k, 2) ways[i][j][k] = 0;
- ways[0][0][0] = 1;
- forn(i, K) forn(f1, 2) forn(f2, 2) {
- int a = gets(s[0], i), b = gets(s[1], i), c = gets(s[2], i);
- forn(j, 3) forn(k, 3) {
- int ff1 = combine(f1, j), ff2 = combine(f2, k);
- if (ff1 < 2 && ff2 < 2) adds(ways[i + 1][ff1][ff2], ways[i][f1][f2] * precalc[a][b][c][j][k]);
- }
- }
- cout << ways[K][1][1] << '\n';
- }
- #ifdef LOCAL_DEFINE
- cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement