Advertisement
Guest User

Untitled

a guest
Nov 25th, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.01 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <string>
  7. #include <cmath>
  8. #include <map>
  9. #include <set>
  10. #include <climits>
  11. #include <cassert>
  12. #include <cctype>
  13. #include <queue>
  14. #include <ctime>
  15. #include <bitset>
  16. using namespace std;
  17.  
  18. typedef long long ll;
  19. typedef double dbl;
  20. typedef long double ld;
  21.  
  22. #define mp make_pair
  23. #define pb push_back
  24. #define sz(x) (int)x.size()
  25. #define all(x) x.begin(),x.end()
  26. #define X first
  27. #define Y second
  28.  
  29. const ll maxn = 1000*1000 + 10;
  30. const dbl eps = 1e-7;
  31. const int mod = 1e9 + 9;
  32.  
  33. ll f1[3][maxn], f2[3][3][maxn], f3[maxn];
  34.  
  35. int main() {
  36. #ifdef _MBCS
  37.     freopen("input.txt", "r", stdin);
  38.     freopen("output.txt", "w", stdout);
  39. #endif
  40.    
  41.  
  42.     int t;
  43.     scanf("%d", &t);
  44.     getchar();
  45.     while (t--) {      
  46.         string s[3];
  47.         getline(cin, s[0]);
  48.         getline(cin, s[1]);
  49.         getline(cin, s[2]);
  50.        
  51.         int maxlen = max(sz(s[0]), max(sz(s[1]), sz(s[2])));
  52.  
  53.         for (int i = 0; i < 3; i++) {
  54.             for (int j = 0; j < 3; j++) {
  55.                 for (int q = 0; q < maxlen + 1; q++) {
  56.                     f2[i][j][q] = 0;
  57.                     f1[i][q] = 0;
  58.                     f3[q] = 0;
  59.                 }
  60.             }
  61.         }
  62.  
  63.  
  64.         while (sz(s[0]) != maxlen) s[0] += 'a' - 1;
  65.         while (sz(s[1]) != maxlen) s[1] += 'a' - 1;
  66.         while (sz(s[2]) != maxlen) s[2] += 'a' - 1;
  67.  
  68.         for (int i = 0; i < 3; i++) {
  69.             f1[i][maxlen] = 1;
  70.             for (int j = maxlen - 1; j >= 0; j--) {
  71.                 if (s[i][j] == '?') {
  72.                     f1[i][j] = (f1[i][j + 1] * 26) % mod;
  73.                 } else {
  74.                     f1[i][j] = f1[i][j + 1];
  75.                 }
  76.             }
  77.         }
  78.  
  79.         for (int i = 0; i < 3; i++) {
  80.             for (int j = i + 1; j < 3; j++) {
  81.                 f2[i][j][maxlen] = 0;
  82.                 for (int k = maxlen - 1; k >= 0; k--) {
  83.  
  84.                     // case ab
  85.                     if (s[i][k] != '?' && s[j][k] != '?') {
  86.                         if (s[i][k] > s[j][k]) {
  87.                             f2[i][j][k] = 0;
  88.                         } else if (s[i][k] == s[j][k]) {
  89.                             f2[i][j][k] = f2[i][j][k + 1];
  90.                         } else {
  91.                             f2[i][j][k] = (f1[i][k + 1] * f1[j][k + 1]) % mod;
  92.                         }
  93.                     }
  94.  
  95.                     // case a?
  96.                     if (s[i][k] != '?' && s[j][k] == '?') {
  97.                         if (s[i][k] != 'a' - 1)
  98.                             f2[i][j][k] = f2[i][j][k + 1];
  99.                         f2[i][j][k] = (f2[i][j][k] + ((((f1[i][k + 1] * f1[j][k + 1]) % mod) * ('z' - s[i][k])) % mod)) % mod;
  100.                     }
  101.  
  102.                     // case ?b
  103.                     if (s[i][k] == '?' && s[j][k] != '?') {
  104.                         if (s[j][k] != 'a' - 1) {
  105.                             f2[i][j][k] = f2[i][j][k + 1];
  106.                             f2[i][j][k] = (f2[i][j][k] + ((((f1[i][k + 1] * f1[j][k + 1]) % mod) * (s[j][k] - 'a')) % mod)) % mod;
  107.                         }
  108.                     }
  109.  
  110.                     // case ??
  111.                     if (s[i][k] == '?' && s[j][k] == '?') {
  112.                         f2[i][j][k] = ((26 * 25 / 2) * ((f1[i][k + 1] + f1[j][k + 1]) % mod)) % mod;
  113.                         f2[i][j][k] = (f2[i][j][k] + ((26 * f2[i][j][k + 1]) % mod)) % mod;
  114.                     }
  115.                 }
  116.             }
  117.         }
  118.  
  119.         f3[maxlen] = 0;
  120.         for (int i = maxlen - 1; i >= 0; i--) {
  121.             //case abc
  122.             if (s[0][i] != '?' && s[1][i] != '?' && s[2][i] != '?') {
  123.                 if (s[0][i] <= s[1][i] && s[1][i] <= s[2][i]) {
  124.                     if (s[0][i] == s[1][i] && s[1][i] == s[2][i])
  125.                         f3[i] = (f3[i] + f3[i + 1]) % mod;
  126.                     if (s[0][i] == s[1][i] && s[1][i] != s[2][i])
  127.                         f3[i] = (f3[i] + ((f2[0][1][i + 1] * f1[2][i + 1]) % mod)) % mod;
  128.                     if (s[0][i] != s[1][i] && s[1][i] == s[2][i])
  129.                         f3[i] = (f3[i] + ((f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod;
  130.                     if (s[0][i] != s[1][i] && s[1][i] != s[2][i])
  131.                         f3[i] = (f3[i] + ((((f1[0][i + 1] * f1[1][i + 1]) % mod) * f1[2][i + 1]) % mod));
  132.                 }
  133.             }
  134.             //case ab?
  135.             if (s[0][i] != '?' && s[1][i] != '?' && s[2][i] == '?') {
  136.                 if (s[0][i] == s[1][i]) {
  137.                     if (s[0][i] != 'a' - 1) f3[i] = (f3[i] + f3[i + 1]) % mod;
  138.                     f3[i] = (f3[i] + (f2[0][1][i + 1] * (('z' - s[0][i]) * f1[2][i + 1]) % mod) % mod) % mod;
  139.                 } else {
  140.                     if (s[0][i] < s[1][i]) {
  141.                         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;
  142.                     }
  143.                 }
  144.             }
  145.             //case a?c
  146.             if (s[0][i] != '?' && s[1][i] == '?' && s[2][i] != '?') {
  147.                 if (s[0][i] > s[2][i]) continue;
  148.                 if (s[0][i] == s[2][i]) {
  149.                     if (s[0][i] != 'a' - 1)
  150.                         f3[i] = (f3[i] + f3[i + 1]) % mod;
  151.                 } else {
  152.                     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)
  153.                         + (f1[0][i + 1] * f2[1][2][i + 1]) % mod) % mod  ) % mod;
  154.                     if (s[0][i] != 'a' - 1)
  155.                         f3[i] = (f3[i] + (f2[0][1][i + 1] * f1[2][i + 1]) % mod) % mod;
  156.                 }
  157.             }
  158.             //case a??
  159.             if (s[0][i] != '?' && s[1][i] == '?' && s[2][i] == '?') {
  160.                 if (s[0][i] == 'a' - 1) {
  161.                     f3[i] = (f3[i] + ((13 * 25 * (((f1[1][i + 1] * f1[2][i + 1]) % mod) * f1[0][i + 1]) % mod) % mod)) % mod;
  162.                     f3[i] = (f3[i] + (((26 * f2[1][2][i + 1]) % mod) * f1[0][i + 1]) % mod) % mod;
  163.                 } else {
  164.                     f3[i] = (f3[i] + f3[i + 1]) % mod;
  165.                     f3[i] = (f3[i] + (((('z' - s[0][i]) * f1[2][i + 1]) % mod) * f2[0][1][i + 1]) % mod) % mod;
  166.                     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;
  167.                     f3[i] = (f3[i] + (('z' - s[0][i]) * ((f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod) % mod;
  168.                 }
  169.             }
  170.             //case ?bc
  171.             if (s[0][i] == '?' && s[1][i] != '?' && s[2][i] != '?') {
  172.                 if (s[1][i] > s[2][i]) continue;
  173.                 if (s[1][i] == 'a' - 1) continue;
  174.                 if (s[1][i] == s[2][i]) {
  175.                     f3[i] = (f3[i] + (((((s[1][i] - 'a') * f1[0][i + 1]) % mod) * f2[1][2][i + 1]) % mod)) % mod;
  176.                     f3[i] = (f3[i] + f3[i + 1]) % mod;
  177.                 } else {
  178.                     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;
  179.                     f3[i] = (f3[i] + (f2[0][1][i + 1] * f1[2][i + 1]) % mod) % mod;
  180.                 }
  181.             }
  182.             //case ?b?
  183.             if (s[0][i] == '?' && s[1][i] != '?' && s[2][i] == '?') {
  184.                 if (s[1][i] == 'a' - 1) continue;
  185.                 f3[i] = (f3[i] + f3[i + 1]) % mod;
  186.                 f3[i] = (f3[i] + (((('z' - s[1][i]) * f2[0][1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod;
  187.                 f3[i] = (f3[i] + ((((s[1][i] - 'a') * f1[0][i + 1]) % mod) * f2[1][2][i + 1]) % mod) % mod;
  188.                 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;
  189.             }
  190.             //case ??c
  191.             if (s[0][i] == '?' && s[1][i] == '?' && s[2][i] != '?') {
  192.                 if (s[2][i] == 'a' - 1) continue;
  193.                 f3[i] = (f3[i] + f3[i + 1]) % mod;
  194.                 f3[i] = (f3[i] + ((s[2][i] - 'a') * ((f2[1][2][i + 1] * f1[0][i + 1]) % mod)) % mod);
  195.                 f3[i] = (f3[i] + ((((s[2][i] - 'a') * f2[0][1][i + 1]) % mod) * f1[2][i + 1]) % mod) % mod;
  196.                 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;
  197.             }
  198.             //case ???
  199.             if (s[0][i] == '?' && s[1][i] == '?' && s[2][i] == '?') {
  200.                 f3[i] = (f3[i] + (2600 * ((f1[0][i + 1] * ((f1[1][i + 1] * f1[2][i + 1]) % mod)) % mod) % mod)) % mod;
  201.                 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;
  202.                 f3[i] = (f3[i] + (26 * f3[i + 1]) % mod) % mod;
  203.             }
  204.  
  205.         }
  206.  
  207.  
  208.         printf("%lld\n", f3[0]);
  209.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement