Pagini recente » Cod sursa (job #2026796) | monthly-2014/runda-2/clasament | Cod sursa (job #2288528) | Cod sursa (job #1031747) | Cod sursa (job #1936157)
#include <cstdio>
#include <cstring>
#define maxn 510
#define mod 3210121
char a[maxn],b[maxn];
int n,m,sol;
int c[maxn][maxn],d[maxn][maxn];
void move(char a[],int n)
{
int i;
for (i=n;i>0;i--) a[i]=a[i-1];
a[0]=' ';
}
int main()
{
freopen("iv.in","r",stdin);
freopen("iv.out","w",stdout);
fgets(a,maxn,stdin);
fgets(b,maxn,stdin);
n=strlen(a)-1;
move(a,n);
m=strlen(b)-1;
move(b,m);
int i,j,k,x,y,z,t;
c[0][0]=1;
for (i=0;i<(n+m)/2;i++)
{
for (j=0;j<=i && j<=n;j++)
for (k=0;k<=i && k<=n;k++)
{
d[j][k]=c[j][k];
c[j][k]=0;
}
for (j=0;j<=i && j<=n;j++)
for (k=0;k<=i && k<=n;k++)
if (d[j][k]!=0)
{
x=j+1;
y=n-k;
z=i-j+1;
t=m+k-i;
if ((x<y) && (a[x]==a[y]))
{
c[j+1][k+1]+=d[j][k];
if (c[j+1][k+1]>mod) c[j+1][k+1]-=mod;
}
if ((x<=y) && (z<=t) && (a[x]==b[t]))
{
c[j+1][k]+=d[j][k];
if (c[j+1][k]>mod) c[j+1][k]-=mod;
}
if ((x<=y) && (z<=t) && (b[z]==a[y]))
{
c[j][k+1]+=d[j][k];
if (c[j][k+1]>mod) c[j][k+1]-=mod;
}
if ((z<t) && (b[z]==b[t]))
{
c[j][k]+=d[j][k];
if (c[j][k]>mod) c[j][k]-=mod;
}
}
}
for (i=0;i<=n;i++)
for (j=0;j<=n;j++)
{
sol+=c[i][j];
if (sol>mod) sol-=mod;
}
printf("%d\n",sol);
return 0;
}