Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #define P9 1000000009
- using namespace std;
- bool cif(char a)
- {
- return (a == 'Z' || (a >= 'a' && a <= 'z'));
- }
- string s1,s2,s3;
- int n1,n2,n3,n;
- int i,j,t;
- long long DP[1000001][4];
- main()
- {
- cin>>t;
- while (t--)
- {
- cin>>s1>>s2>>s3;
- s1="Z"+s1;
- s2="Z"+s2;
- s3="Z"+s3;
- n1=s1.size();
- n2=s2.size();
- n3=s3.size();
- n=max(max(n1,n2),n3);
- while (s1.size() < n) s1+='Z';
- while (s2.size() < n) s2+='Z';
- while (s3.size() < n) s3+='Z';
- DP[0][0]=1; // 0 - 1=2=3
- DP[0][1]=0; // 1 - 1=2<3
- DP[0][2]=0; // 2 - 1<2=3
- DP[0][3]=0; // 3 - 1<2<3
- for (i=1;i<n;i++)
- {
- for (j=0;j<4;j++)
- DP[i][j]=0;
- if (cif(s1[i]) && cif(s2[i]) && cif(s3[i]) )
- {
- DP[i][0]=(s1[i] == s2[i])*(s2[i] == s3[i])*DP[i-1][0];
- DP[i][1]=(s1[i] == s2[i])*(DP[i-1][1]+DP[i-1][0]*(s3[i] > s2[i]));
- DP[i][2]=(s2[i] == s3[i])*(DP[i-1][2]+DP[i-1][0]*(s2[i] > s1[i]));
- 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]);
- }
- if (s1[i] == '?' && cif(s2[i]) && cif(s3[i]) )
- {
- DP[i][0]=(s3[i] == s2[i])*DP[i-1][0];
- DP[i][1]=DP[i-1][1]+DP[i-1][0]*(s3[i] > s2[i]);
- DP[i][2]=(s3[i] == s2[i])*(DP[i-1][2]*26+(s2[i]-'a')*DP[i-1][0]);
- 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'));
- }
- if (cif(s1[i]) && s2[i] == '?' && cif(s3[i]) )
- {
- DP[i][0]=(s1[i] == s2[i])*DP[i-1][0];
- DP[i][1]=DP[i-1][1]+(s3[i] > s1[i])*DP[i-1][0];
- DP[i][2]=DP[i-1][2]+(s3[i] > s1[i])*DP[i-1][0];
- 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');
- }
- if (cif(s1[i]) && cif(s2[i]) && s3[i] == '?' )
- {
- DP[i][0]=(s1[i] == s2[i])*DP[i-1][0];
- DP[i][1]=(s1[i] == s2[i])*(('z'-s2[i])*DP[i-1][0]+26*DP[i-1][1]);
- DP[i][2]=DP[i-1][2];
- 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]);
- }
- if (s1[i] == '?' && s2[i] == '?' && s3[i] == '?')
- {
- DP[i][0]=DP[i-1][0]*26;
- DP[i][1]=DP[i-1][0]*25*13+DP[i-1][1]*26*26;
- DP[i][2]=DP[i-1][0]*25*13+DP[i-1][2]*26*26;
- 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;
- }
- if (s1[i] == '?' && cif(s2[i]) && s3[i] == '?' )
- {
- DP[i][0]=DP[i-1][0];
- DP[i][1]=DP[i-1][0]*('z'-s2[i])+DP[i-1][1]*26;
- DP[i][2]=DP[i-1][0]*(s2[i]-'a')+DP[i-1][2]*26;
- 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;
- }
- if (s1[i] == '?' && s2[i] == '?' && cif(s3[i]))
- {
- DP[i][0]=DP[i-1][0];
- DP[i][1]=DP[i-1][1]*26+DP[i-1][0]*(s3[i]-'a');
- DP[i][2]=DP[i-1][2]*26+DP[i-1][0]*(s3[i]-'a');
- 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;
- }
- if (cif(s1[i]) && s2[i] == '?' && s3[i] == '?')
- {
- DP[i][0]=DP[i-1][0];
- DP[i][1]=DP[i-1][0]*('z'-s1[i])+DP[i-1][1]*26;
- DP[i][2]=DP[i-1][0]*('z'-s1[i])+DP[i-1][2]*26;
- 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;
- }
- for (j=0;j<4;j++)
- DP[i][j]%=P9;
- }
- cout<<DP[n-1][3]<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement