Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cstring>
- #include <string>
- #include <cmath>
- #include <map>
- #include <set>
- #include <climits>
- #include <cassert>
- #include <cctype>
- #include <queue>
- #include <ctime>
- #include <bitset>
- using namespace std;
- typedef long long ll;
- typedef double dbl;
- typedef long double ld;
- #define mp make_pair
- #define pb push_back
- #define sz(x) (int)x.size()
- #define all(x) x.begin(),x.end()
- #define X first
- #define Y second
- const ll maxn = 1000*1000 + 10;
- const dbl eps = 1e-7;
- const int mod = 1e9 + 9;
- ll f1[3][maxn], f2[3][3][maxn], f3[maxn];
- int main() {
- #ifdef _MBCS
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- int t;
- scanf("%d", &t);
- getchar();
- while (t--) {
- string s[3];
- getline(cin, s[0]);
- getline(cin, s[1]);
- getline(cin, s[2]);
- int maxlen = max(sz(s[0]), max(sz(s[1]), sz(s[2])));
- for (int i = 0; i < 3; i++) {
- for (int j = 0; j < 3; j++) {
- for (int q = 0; q < maxlen + 1; q++) {
- f2[i][j][q] = 0;
- f1[i][q] = 0;
- f3[q] = 0;
- }
- }
- }
- while (sz(s[0]) != maxlen) s[0] += 'a' - 1;
- while (sz(s[1]) != maxlen) s[1] += 'a' - 1;
- while (sz(s[2]) != maxlen) s[2] += 'a' - 1;
- for (int i = 0; i < 3; i++) {
- f1[i][maxlen] = 1;
- for (int j = maxlen - 1; j >= 0; j--) {
- if (s[i][j] == '?') {
- f1[i][j] = (f1[i][j + 1] * 26) % mod;
- } else {
- f1[i][j] = f1[i][j + 1];
- }
- }
- }
- for (int i = 0; i < 3; i++) {
- for (int j = i + 1; j < 3; j++) {
- f2[i][j][maxlen] = 0;
- for (int k = maxlen - 1; k >= 0; k--) {
- // case ab
- if (s[i][k] != '?' && s[j][k] != '?') {
- if (s[i][k] > s[j][k]) {
- f2[i][j][k] = 0;
- } else if (s[i][k] == s[j][k]) {
- f2[i][j][k] = f2[i][j][k + 1];
- } else {
- f2[i][j][k] = (f1[i][k + 1] * f1[j][k + 1]) % mod;
- }
- }
- // case a?
- if (s[i][k] != '?' && s[j][k] == '?') {
- if (s[i][k] != 'a' - 1)
- f2[i][j][k] = f2[i][j][k + 1];
- f2[i][j][k] = (f2[i][j][k] + ((((f1[i][k + 1] * f1[j][k + 1]) % mod) * ('z' - s[i][k])) % mod)) % mod;
- }
- // case ?b
- if (s[i][k] == '?' && s[j][k] != '?') {
- if (s[j][k] != 'a' - 1) {
- f2[i][j][k] = f2[i][j][k + 1];
- f2[i][j][k] = (f2[i][j][k] + ((((f1[i][k + 1] * f1[j][k + 1]) % mod) * (s[j][k] - 'a')) % mod)) % mod;
- }
- }
- // case ??
- if (s[i][k] == '?' && s[j][k] == '?') {
- f2[i][j][k] = ((26 * 25 / 2) * ((f1[i][k + 1] + f1[j][k + 1]) % mod)) % mod;
- f2[i][j][k] = (f2[i][j][k] + ((26 * f2[i][j][k + 1]) % mod)) % mod;
- }
- }
- }
- }
- f3[maxlen] = 0;
- for (int i = maxlen - 1; i >= 0; i--) {
- //case abc
- if (s[0][i] != '?' && s[1][i] != '?' && s[2][i] != '?') {
- if (s[0][i] <= s[1][i] && s[1][i] <= s[2][i]) {
- if (s[0][i] == s[1][i] && s[1][i] == s[2][i])
- f3[i] = (f3[i] + f3[i + 1]) % mod;
- if (s[0][i] == s[1][i] && s[1][i] != s[2][i])
- f3[i] = (f3[i] + ((f2[0][1][i + 1] * f1[2][i + 1]) % mod)) % mod;
- if (s[0][i] != s[1][i] && s[1][i] == s[2][i])
- f3[i] = (f3[i] + ((f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod;
- if (s[0][i] != s[1][i] && s[1][i] != s[2][i])
- f3[i] = (f3[i] + ((((f1[0][i + 1] * f1[1][i + 1]) % mod) * f1[2][i + 1]) % mod));
- }
- }
- //case ab?
- if (s[0][i] != '?' && s[1][i] != '?' && s[2][i] == '?') {
- if (s[0][i] == s[1][i]) {
- if (s[0][i] != 'a' - 1) f3[i] = (f3[i] + f3[i + 1]) % mod;
- f3[i] = (f3[i] + (f2[0][1][i + 1] * (('z' - s[0][i]) * f1[2][i + 1]) % mod) % mod) % mod;
- } else {
- if (s[0][i] < s[1][i]) {
- f3[i] = (f3[i] + ((((((f1[0][i + 1] * f1[1][i + 1]) % mod) * f1[2][i + 1]) % mod) * ('z' - s[1][i])) % mod + ((f1[0][i + 1] * f2[1][2][i + 1]) % mod) % mod)) % mod;
- }
- }
- }
- //case a?c
- if (s[0][i] != '?' && s[1][i] == '?' && s[2][i] != '?') {
- if (s[0][i] > s[2][i]) continue;
- if (s[0][i] == s[2][i]) {
- if (s[0][i] != 'a' - 1)
- f3[i] = (f3[i] + f3[i + 1]) % mod;
- } else {
- f3[i] = (f3[i] + ((((((((s[2][i] - s[0][i] - 1) * f1[1][i + 1]) % mod) * f1[0][i + 1]) % mod) * f1[2][i + 1]) % mod)
- + (f1[0][i + 1] * f2[1][2][i + 1]) % mod) % mod ) % mod;
- if (s[0][i] != 'a' - 1)
- f3[i] = (f3[i] + (f2[0][1][i + 1] * f1[2][i + 1]) % mod) % mod;
- }
- }
- //case a??
- if (s[0][i] != '?' && s[1][i] == '?' && s[2][i] == '?') {
- if (s[0][i] == 'a' - 1) {
- f3[i] = (f3[i] + ((13 * 25 * (((f1[1][i + 1] * f1[2][i + 1]) % mod) * f1[0][i + 1]) % mod) % mod)) % mod;
- f3[i] = (f3[i] + (((26 * f2[1][2][i + 1]) % mod) * f1[0][i + 1]) % mod) % mod;
- } else {
- f3[i] = (f3[i] + f3[i + 1]) % mod;
- f3[i] = (f3[i] + (((('z' - s[0][i]) * f1[2][i + 1]) % mod) * f2[0][1][i + 1]) % mod) % mod;
- f3[i] = ((f3[i] + (((((('z' - s[0][i]) * ('z' - 1 - s[0][i]) / 2) % mod) * f1[0][i + 1]) % mod) * f1[1][i + 1]) % mod * f1[2][i + 1]) % mod) % mod;
- f3[i] = (f3[i] + (('z' - s[0][i]) * ((f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod) % mod;
- }
- }
- //case ?bc
- if (s[0][i] == '?' && s[1][i] != '?' && s[2][i] != '?') {
- if (s[1][i] > s[2][i]) continue;
- if (s[1][i] == 'a' - 1) continue;
- if (s[1][i] == s[2][i]) {
- f3[i] = (f3[i] + (((((s[1][i] - 'a') * f1[0][i + 1]) % mod) * f2[1][2][i + 1]) % mod)) % mod;
- f3[i] = (f3[i] + f3[i + 1]) % mod;
- } else {
- f3[i] = (f3[i] + ((((((((s[1][i] - 'a') * f1[0][i + 1]) % mod) * f1[1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod)) % mod;
- f3[i] = (f3[i] + (f2[0][1][i + 1] * f1[2][i + 1]) % mod) % mod;
- }
- }
- //case ?b?
- if (s[0][i] == '?' && s[1][i] != '?' && s[2][i] == '?') {
- if (s[1][i] == 'a' - 1) continue;
- f3[i] = (f3[i] + f3[i + 1]) % mod;
- f3[i] = (f3[i] + (((('z' - s[1][i]) * f2[0][1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod;
- f3[i] = (f3[i] + ((((s[1][i] - 'a') * f1[0][i + 1]) % mod) * f2[1][2][i + 1]) % mod) % mod;
- f3[i] = (f3[i] + (('z' - s[1][i]) * (s[1][i] - 'a') * (((f1[0][i + 1] * f1[1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod) % mod;
- }
- //case ??c
- if (s[0][i] == '?' && s[1][i] == '?' && s[2][i] != '?') {
- if (s[2][i] == 'a' - 1) continue;
- f3[i] = (f3[i] + f3[i + 1]) % mod;
- f3[i] = (f3[i] + ((s[2][i] - 'a') * ((f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod);
- f3[i] = (f3[i] + ((((s[2][i] - 'a') * f2[0][1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod;
- f3[i] = (f3[i] + ((((((((s[2][i] - 'a') * (s[2][i] - 'a' - 1) / 2) % mod) * f1[0][i + 1]) % mod) * f1[1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod;
- }
- //case ???
- if (s[0][i] == '?' && s[1][i] == '?' && s[2][i] == '?') {
- f3[i] = (f3[i] + (2600 * ((f1[0][i + 1] * ((f1[1][i + 1] * f1[2][i + 1]) % mod)) % mod) % mod)) % mod;
- f3[i] = (f3[i] + (13 * 25 * ((((f2[0][1][i + 1] * f1[2][i + 1]) % mod + (f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod)) % mod) % mod;
- f3[i] = (f3[i] + (26 * f3[i + 1]) % mod) % mod;
- }
- }
- printf("%lld\n", f3[0]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement