Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. #define P9 1000000009
  5.  
  6. using namespace std;
  7.  
  8. bool cif(char a)
  9.  {
  10.   return (a == 'Z' || (a >= 'a' && a <= 'z'));
  11.  }
  12.  
  13. string s1,s2,s3;
  14. int n1,n2,n3,n;
  15. int i,j,t;
  16. long long DP[1000001][4];
  17.  
  18. main()
  19.  {
  20.   cin>>t;
  21.   while (t--)
  22.    {
  23.     cin>>s1>>s2>>s3;
  24.     s1="Z"+s1;
  25.     s2="Z"+s2;
  26.     s3="Z"+s3;
  27.     n1=s1.size();
  28.     n2=s2.size();
  29.     n3=s3.size();
  30.     n=max(max(n1,n2),n3);
  31.  
  32.     while (s1.size() < n) s1+='Z';
  33.     while (s2.size() < n) s2+='Z';
  34.     while (s3.size() < n) s3+='Z';
  35.  
  36.     DP[0][0]=1;  // 0 - 1=2=3
  37.     DP[0][1]=0;  // 1 - 1=2<3
  38.     DP[0][2]=0;  // 2 - 1<2=3
  39.     DP[0][3]=0;  // 3 - 1<2<3
  40.     for (i=1;i<n;i++)
  41.      {
  42.       for (j=0;j<4;j++)
  43.         DP[i][j]=0;
  44.       if (cif(s1[i]) && cif(s2[i]) && cif(s3[i]) )
  45.        {
  46.         DP[i][0]=(s1[i] == s2[i])*(s2[i] == s3[i])*DP[i-1][0];
  47.         DP[i][1]=(s1[i] == s2[i])*(DP[i-1][1]+DP[i-1][0]*(s3[i] > s2[i]));
  48.         DP[i][2]=(s2[i] == s3[i])*(DP[i-1][2]+DP[i-1][0]*(s2[i] > s1[i]));
  49.         DP[i][3]=DP[i-1][3]+DP[i-1][0]*(s2[i] > s1[i])*(s3[i] > s2[i])+DP[i-1][1]*(s2[i] > s1[i])+DP[i-1][2]*(s3[i] > s2[i]);
  50.       }
  51.      if (s1[i] == '?' && cif(s2[i]) && cif(s3[i]) )
  52.       {
  53.        DP[i][0]=(s3[i] == s2[i])*DP[i-1][0];
  54.        DP[i][1]=DP[i-1][1]+DP[i-1][0]*(s3[i] > s2[i]);
  55.        DP[i][2]=(s3[i] == s2[i])*(DP[i-1][2]*26+(s2[i]-'a')*DP[i-1][0]);
  56.        DP[i][3]=DP[i-1][3]*26+(s2[i]-'a')*DP[i-1][1]+(s3[i] > s2[i])*(26*DP[i-1][2]+DP[i-1][0]*(s2[i]-'a'));
  57.       }
  58.      if (cif(s1[i]) && s2[i] == '?' && cif(s3[i]) )
  59.       {
  60.        DP[i][0]=(s1[i] == s2[i])*DP[i-1][0];
  61.        DP[i][1]=DP[i-1][1]+(s3[i]  > s1[i])*DP[i-1][0];
  62.        DP[i][2]=DP[i-1][2]+(s3[i]  > s1[i])*DP[i-1][0];
  63.        DP[i][3]=DP[i-1][3]*26+(s3[i]  > s1[i])*(s3[i]-s1[i]-1)*DP[i-1][0]+DP[i-1][1]*('z'-s1[i])+DP[i-1][2]*(s3[i]-'a');
  64.       }
  65.     if (cif(s1[i]) && cif(s2[i]) && s3[i] == '?' )
  66.      {
  67.       DP[i][0]=(s1[i] == s2[i])*DP[i-1][0];
  68.       DP[i][1]=(s1[i] == s2[i])*(('z'-s2[i])*DP[i-1][0]+26*DP[i-1][1]);
  69.       DP[i][2]=DP[i-1][2];
  70.       DP[i][3]=DP[i-1][3]*26+(s2[i]  > s1[i])*(DP[i-1][0]*('z'-s2[i])+DP[i-1][1]*26)+DP[i-1][2]*('z'-s2[i]);
  71.      }
  72.     if (s1[i] == '?' && s2[i] == '?' && s3[i] == '?')
  73.      {
  74.       DP[i][0]=DP[i-1][0]*26;
  75.       DP[i][1]=DP[i-1][0]*25*13+DP[i-1][1]*26*26;
  76.       DP[i][2]=DP[i-1][0]*25*13+DP[i-1][2]*26*26;
  77.       DP[i][3]=DP[i-1][0]*2600+DP[i-1][1]*26*25*13+DP[i-1][2]*26*25*13+DP[i-1][3]*26*26*26;
  78.      }
  79.     if (s1[i] == '?' && cif(s2[i]) && s3[i] == '?' )
  80.      {
  81.       DP[i][0]=DP[i-1][0];
  82.       DP[i][1]=DP[i-1][0]*('z'-s2[i])+DP[i-1][1]*26;
  83.       DP[i][2]=DP[i-1][0]*(s2[i]-'a')+DP[i-1][2]*26;
  84.       DP[i][3]=DP[i-1][0]*(s2[i]-'a')*('z'-s2[i])+DP[i-1][1]*(s2[i]-'a')+DP[i-2][2]*('z'-s2[i])+DP[i-1][3]*26*26;
  85.      }
  86.     if (s1[i] == '?' && s2[i] == '?' && cif(s3[i]))
  87.      {
  88.       DP[i][0]=DP[i-1][0];
  89.       DP[i][1]=DP[i-1][1]*26+DP[i-1][0]*(s3[i]-'a');
  90.       DP[i][2]=DP[i-1][2]*26+DP[i-1][0]*(s3[i]-'a');
  91.       DP[i][3]=DP[i-1][0]*((s3[i]-'a'-1)*(s3[i]-'a')/2)+DP[i-1][1]*25*13+DP[i-1][2]*26*(s3[i]-'a')+DP[i-1][3]*26*26;
  92.      }
  93.     if (cif(s1[i]) && s2[i] == '?' && s3[i] == '?')
  94.      {
  95.       DP[i][0]=DP[i-1][0];
  96.       DP[i][1]=DP[i-1][0]*('z'-s1[i])+DP[i-1][1]*26;
  97.       DP[i][2]=DP[i-1][0]*('z'-s1[i])+DP[i-1][2]*26;
  98.       DP[i][3]=DP[i-1][0]*(('z'-s1[i]-1)*('z'-s1[i])/2)+DP[i-1][1]*26*('z'-s1[i])+DP[i-1][2]*25*13+DP[i-1][3]*26*26;
  99.      }
  100.     for (j=0;j<4;j++)
  101.      DP[i][j]%=P9;
  102.    }
  103.   cout<<DP[n-1][3]<<endl;
  104.   }
  105.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement