Pagini recente » Cod sursa (job #3154869) | Cod sursa (job #1716693) | Cod sursa (job #2037688) | Cod sursa (job #2757034) | Cod sursa (job #2275987)
#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,vf1,vf2;
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++)
dp[t2][i][j]=0;
for(int j=0;j<=f;j++)
{
f2=j;
pozf2=n-f2;
g2=f-f2;
pozg2=m-g2;
// cout<<i<<' '<<j<<' '<<pozf1<<' '<<pozf2<<' '<<pozg1<<' '<<pozg2<<'\n';
if(f1+f2>n)
continue;
if(g1+g2>m)
continue;
vf1=vf2=1;
if(f1+f2==n)
vf1=0;
if(g1+g2==m)
vf2=0;
if(pozf1<=n&&pozf2>0)
if(vf1)
if(a[pozf1]==a[pozf2]&&pozf1!=pozf2)
dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1+1][f2+1])%M;
if(pozf1<=n&&pozg2>0)
if(vf1&&vf2)
if(a[pozf1]==b[pozg2])
{
dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1+1][f2])%M;
}
if(pozg1<=m&&pozf2>0)
if(vf2&&vf1)
if(b[pozg1]==a[pozf2])
dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1][f2+1])%M;
if(pozg1<=m&&pozg2>0)
if(vf2)
if(b[pozg1]==b[pozg2]&&pozg1!=pozg2)
dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1][f2])%M;
ma=max(ma,dp[t2][f1][f2]);
}
}
t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
}
fout<<dp[t1][0][0];
}