简单DP+高精度,后面将高精度优化了一下
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=10010;
char stra[maxn],strb[110];
int lena,lenb,dp[110][maxn][21];
void Add(int *ans,int *a,int *b)
{
for(int i=0;i<=20;i++)
{
ans[i]+=a[i]+b[i];
ans[i+1]+=ans[i]/100000000;
ans[i]%=100000000;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",stra,strb);
lena=strlen(stra);
lenb=strlen(strb);
for(int i=0;i<=lena;i++)
dp[0][i][0]=1;
for(int i=1;i<=lenb;i++)
for(int j=1;j<=lena;j++)
{
memset(dp[i][j],0,sizeof(dp[i][j]));
if(stra[j-1]==strb[i-1])
Add(dp[i][j],dp[i][j-1],dp[i-1][j-1]);
else
memcpy(dp[i][j],dp[i][j-1],sizeof(dp[i][j-1]));
}
int i;
for(i=20;i>=0;i--)
if(dp[lenb][lena][i])
break;
printf("%d",dp[lenb][lena][i--]);
for(;i>=0;i--)
printf("%08d",dp[lenb][lena][i]);
printf("\n");
}
return 0;
}