Pagini recente » Cod sursa (job #3226545) | Cod sursa (job #2045345) | Cod sursa (job #1201533) | Cod sursa (job #2814724) | Cod sursa (job #373009)
Cod sursa(job #373009)
#include<stdio.h>
#define REST 666013
char a[512],b[512];
int ss[512][512],sol[512][512],pa[512][32],pb[512][32];
int n,m;
inline int max(int x,int y){
return x>y?x:y;
}
int main(){
freopen("subsir.in","r",stdin);
freopen("subsir.out","w",stdout);
int i,j,k,p1,p2;
fgets(a+1,510,stdin);
fgets(b+1,510,stdin);
for(n=1;'a'<=a[n] && a[n]<='z';++n);
--n;
for(m=1;'a'<=b[m] && b[m]<='z';++m);
--m;
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
if(a[i]==b[j])
ss[i][j]=1+ss[i-1][j-1];
else
ss[i][j]=max(ss[i-1][j],ss[i][j-1]);
}
}
for(i=1;i<=n;++i){
for(k=0;k<26;++k){
pa[i][k]=pa[i-1][k];
}
pa[i][a[i]-'a']=i;
}
for(i=1;i<=m;++i){
for(k=0;k<26;++k){
pb[i][k]=pb[i-1][k];
}
pb[i][b[i]-'a']=i;
}
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
if(a[i]!=b[j])
continue;
if(ss[i][j]==1){
sol[i][j]=1;
continue;
}
for(k=0;k<26;++k){
p1=pa[i][k];
p2=pb[j][k];
if(p1<i && p2<j && 1+ss[p1][p2]==ss[i][j]){
sol[i][j]+=sol[p1][p2];
if(sol[i][j]>=REST)
sol[i][j]-=REST;
}
}
}
}
printf("%d\n",sol[n][m]);
fclose(stdin);
fclose(stdout);
return 0;
}