UVA11081 string
1 /* 2 题意:T组测试,每行三个串,求 用前两个串的一些子串(可以是空)有多少种方式可以拼成第三个串。 3 4 参考了 http://blog.csdn.net/u012997373/article/details/38762393?utm_source=tuicool&utm_medium=referral 5 6 用三个三维数组 。 7 f[i][j][k] 表示 拼到第三个串的第 K 个字符时,用到了第一个串的前 i 个字符, 第二个串的前 j 个字符。 8 但是第 K 个字符的来源有两个地方,s1 和 s2, 9 所以用 f1[i][j][k]表示第 K 个字符来自 s1 串,f2 同理表示来自 s2 串 。 10 辣么最后 f[i][j][k] = f1[i][j][k] + f2[i][j][k] ; 11 12 考虑到空串,初始化时 f[i][j][0] = f1[i][j][0] = f2[i][j][0] = 1 ; 13 */ 14 15 16 17 #include<cstdio> 18 #include<cstring> 19 #include<algorithm> 20 using namespace std; 21 const int maxn=65; 22 const int MOD=10007; 23 int f[maxn][maxn][maxn],f1[maxn][maxn][maxn],f2[maxn][maxn][maxn]; 24 char a[maxn],b[maxn],c[maxn]; 25 int main() 26 { 27 int t; 28 scanf("%d",&t); 29 while(t--) 30 { 31 scanf("%s%s%s",a,b,c); 32 int la=strlen(a); 33 int lb=strlen(b); 34 int lc=strlen(c); 35 memset(f1,0,sizeof(f1)); 36 memset(f2,0,sizeof(f2)); 37 memset(f,0,sizeof(f)); 38 for(int i=0;i<=la;i++) 39 for(int j=0;j<=lb;j++) 40 { 41 f[i][j][0]=1; 42 f1[i][j][0]=1; 43 f2[i][j][0]=1; 44 } 45 for(int k=1;k<=lc;k++) 46 { 47 for(int i=0;i<=la;i++) 48 { 49 for(int j=0;j<=lb;j++) 50 { 51 if(i) 52 { 53 f1[i][j][k] = f1[i-1][j][k]; 54 if(c[k-1] == a[i-1]) 55 f1[i][j][k] = (f1[i][j][k] + f[i-1][j][k-1] ) % MOD; 56 } 57 if(j) 58 { 59 f2[i][j][k] = f2[i][j-1][k]; 60 if(c[k-1] == b[j-1]) 61 f2[i][j][k] = ( f2[i][j][k] + f[i][j-1][k-1] ) % MOD; 62 } 63 f[i][j][k] = (f1[i][j][k] + f2[i][j][k]) % MOD; 64 } 65 } 66 } 67 printf("%d\n",f[la][lb][lc]); 68 } 69 return 0; 70 }