Pagini recente » Cod sursa (job #1866475) | Cod sursa (job #1926083) | Cod sursa (job #1689068) | Cod sursa (job #474119) | Cod sursa (job #2275947)
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
const int DN=505,M=3210121;
int n,m,dp[3][DN][DN],t0=0,t1=1,t2=2,f1,g1,f2,g2,pozf1,pozf2,pozg2,pozg1,f,ma;
char a[DN],b[DN];
int main()
{
//cout<<sizeof(dp)/1000;
fin.getline(a+1,DN);
fin.getline(b+1,DN);
n=strlen(a+1);
m=strlen(b+1);
for(int l=0;l<=n+m;l++)
{
if(l==0)
{
for(int i=0;i<=n;i++)
dp[t2][i][n-i]=1;
t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
continue;
}
if(l==1)
{
for(int i=0;i<=n;i++)
dp[t2][i][n-i]=1;
for(int i=0;i<n;i++)
dp[t2][i][n-i-1]=(dp[t2][i][n-i-1]+1)%M;
t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
continue;
}
f=n+m-l;
if(f%2)
{
t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
continue;
}
f/=2;
for(int i=0;i<=f;i++)
{
f1=i;
g1=f-i;
pozg1=g1+1;
pozf1=f1+1;
for(int j=0;j<=f;j++)
{
f2=j;
pozf2=n-f2;
g2=f-f2;
pozg2=m-g2;
if(pozf2<0)
break;
if(pozg2<0)
break;
if(pozg2<pozg1||pozf2<pozf1)
continue;
if(pozf1<=n&&pozf2>0)
if(a[pozf1]==a[pozf2]&&pozf1!=pozf2)
dp[t2][f1][g1]=(dp[t2][f1][g1]+dp[t0][f1+1][g1+1])%M;
if(pozf1<=n&&pozg2>0)
if(a[pozf1]==b[pozg2])
{
dp[t2][f1][g1]=(dp[t2][f1][g1]+dp[t0][f1+1][g1])%M;
}
if(pozg1<=m&&pozf2>0)
if(b[pozg1]==a[pozf2])
dp[t2][f1][g1]=(dp[t2][f1][g1]+dp[t0][f1][g1+1])%M;
if(pozg1<=m&&pozg2>0)
if(b[pozg1]==b[pozg2]&&pozg1!=pozg2)
dp[t2][f1][g1]=(dp[t2][f1][g1]+dp[t0][f1][g1])%M;
ma=max(ma,dp[t2][f1][g1]);
}
}
t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
}
fout<<dp[t1][0][0];
}