![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <string> #include <algorithm> #define maxn 10000 using namespace std; void reverse(string &ans,int ct){ for(int i=0;i<ct/2;i++){ swap(ans[i],ans[ct-1-i]); } } string mul(string a,string b){ int la=a.length(),lb=b.length(); string ans=""; int c[maxn],ct=0,d[maxn];//c plus d num memset(d,0,sizeof d); reverse(a,la),reverse(b,lb); for(int i=0;i<lb;i++){ memset(c,0,sizeof c); for(int j=0;j<la;j++){ d[i+j]+=(b[i]-'0')*(a[j]-'0')+c[i+j]; c[i+j+1]=d[i+j]/10; d[i+j]%=10; } if(c[i+la]) d[i+la]=c[i+la],ct=i+1+la; else ct=i+la; } int i=ct-1; //脠楼脟掳碌艗0 while(i>=0&&d[i]==0) i--; if(i<0) ans="0"; // else for(;i>=0;i--) ans+=d[i]+'0'; return ans; } string add(string a,string b){ int la=a.length(),lb=b.length(); int c=0,ct; int d[maxn]; string ans=""; if(la>lb) swap(a,b),swap(la,lb); reverse(a,la),reverse(b,lb); for(int i=0;i<la;i++){ d[i]=a[i]-'0'+b[i]-'0'+c; c=d[i]/10; d[i]%=10; } for(int i=la;i<lb;i++){ d[i]=b[i]-'0'+c; c=d[i]/10; d[i]%=10; } if(c) d[lb]=c,ct=lb+1; else ct=lb; int i=ct-1; //脠楼脟掳碌艗0 while(i>=0&&d[i]==0) i--; if(i<0) ans="0"; // else for(;i>=0;i--) ans+=d[i]+'0'; return ans; } string itoa(int x){ string ans=""; int ct=0; while(x){ ans+=x%10+'0'; x/=10,ct++; } reverse(ans,ct); return ans; } int t; char a[10010],b[110]; string dp[10010][110]; int main(){ //freopen("10069","r",stdin); scanf("%d",&t); for(int ca=1;ca<=t;ca++){ scanf("%s%s",a+1,b+1); int la=strlen(a+1),lb=strlen(b+1); for(int i=0;i<=la;i++){ for(int j=0;j<=lb;j++){ dp[i][j]="0"; } } for(int i=1;i<=la;i++){ if(a[i]==b[1]) dp[i][1]=add(dp[i][1],"1"); dp[i+1][1]=dp[i][1]; } for(int i=2;i<=la;i++){ for(int j=2;j<=lb;j++){ if(a[i]==b[j]){ dp[i][j]=add(dp[i][j],dp[i-1][j-1]); } dp[i+1][j]=add(dp[i+1][j],dp[i][j]); } } cout<<dp[la][lb]<<endl; } return 0; }