Pagini recente » Cod sursa (job #2936124) | Cod sursa (job #2485044) | Cod sursa (job #2035372) | Cod sursa (job #1821791) | Cod sursa (job #2220614)
#include<fstream>
#include<cstring>
#include<iostream>
#define DN 605
#define M 666013
using namespace std;
ifstream fin("subsir.in");
ofstream fout("subsir.out");
int n,m,dp1[DN][DN],dp2[DN][DN],l1[35][DN],l2[35][DN],p1,p2;
char a[DN],b[DN];
int main()
{
fin.getline(a+1,DN);
fin.getline(b+1,DN);
n=strlen(a+1);
m=strlen(b+1);
for(int i=1;i<=n;i++)
{
for(int j=0;j<30;j++)
l1[j][i]=l1[j][i-1];
l1[a[i]-'a'][i]=i;
}
for(int i=1;i<=m;i++)
{
for(int j=0;j<30;j++)
l2[j][i]=l2[j][i-1];
l2[b[i]-'a'][i]=i;
}
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
{
if(i==0||j==0)
{
dp1[i][j]=0;
dp2[i][j]=1;
continue;
}
if(dp1[i-1][j]>dp1[i][j-1])
dp1[i][j]=dp1[i-1][j];
else
dp1[i][j]=dp1[i][j-1];
if(a[i]==b[j])
if(dp1[i-1][j-1]+1>dp1[i][j])
dp1[i][j]=dp1[i-1][j-1]+1;
if(dp1[i][j]==0)
{
dp2[i][j]=1;
continue;
}
for(int h=0;h<30;h++)
if(l1[h][i]>0&&l2[h][j]>0)
{
p1=l1[h][i]-1;
p2=l2[h][j]-1;
if(p1>=0&&p2>=0)
if(dp1[p1][p2]==dp1[i][j]-1)
dp2[i][j]=(dp2[i][j]+dp2[p1][p2])%M;
}
}
if(dp1[n][m]==0)
dp2[n][m]=0;
fout<<dp2[n][m];
}