Pagini recente » Cod sursa (job #1802268) | Cod sursa (job #3288028) | Cod sursa (job #2278504) | Cod sursa (job #509607) | Cod sursa (job #458278)
Cod sursa(job #458278)
#include <cstdio>
#include <cstring>
#define N 666013
char a[505],b[505];
int rez,nr[505][505],i,j,n,m,p,c[505][505],la[28][505],lb[28][505];
int main()
{
freopen("subsir.in","r",stdin);
freopen("subsir.out","w",stdout);
scanf("%s\n%s",a,b);
n=strlen(a)-1;
m=strlen(b)-1;
for (i=0;i<=n;++i)
for (j=0;j<=m;++j)
if (a[i]==b[j])
c[i][j]=c[i-1][j-1]+1; else
if (c[i-1][j]>c[i][j-1])
c[i][j]=c[i-1][j]; else
c[i][j]=c[i][j-1];
for (i=0;i<=25;++i)
{
for (p=-1,j=0;j<=n;++j)
{
if (a[j]=='a'+i) p=j;
la[i][j]=p;
}
for (p=-1,j=0;j<=m;++j)
{
if (b[j]=='a'+i) p=j;
lb[i][j]=p;
}
}
for (i=0;i<=n;++i)
for (j=0;j<=m;++j)
if ((c[i][j]==1) && (a[i]==b[j]))
nr[i][j]=1;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
if (a[i]==b[j])
{
for (p=0;p<=25;++p)
if (c[i][j]==c[la[p][i-1]][lb[p][j-1]]+1)
nr[i][j]=(nr[i][j]+nr[la[p][i-1]][lb[p][j-1]])%N;
if ((c[i][j]==c[n][m]) && (la[a[i]-'a'][n]<=i) && (lb[b[j]-'a'][m]<=j))
rez=(rez+nr[i][j])%N;
}
/*for (i=0;i<=n;++i)
{
for (j=0;j<=m;++j)
printf("%d ",nr[i][j]);
printf("\n");
}*/
printf("%d",rez);
return 0;}