Pagini recente » Cod sursa (job #1031953) | Cod sursa (job #1930578) | Cod sursa (job #2167425) | Cod sursa (job #217262) | Cod sursa (job #255168)
Cod sursa(job #255168)
#include <stdio.h>
#include <string>
#define maxn 510
using namespace std;
long d[2][maxn][maxn];
long n, i, j, k, l1, l2, sol, l, p1, p2, q1, q2, w;
char a[maxn], b[maxn];
const long co=3210121;
int main()
{
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
scanf("%c", &a[1]);
l1=1;
while(a[l1]>='A')
{
l1++;
scanf("%c", &a[l1]);
}
l1--;
scanf("%c", &b[1]);
l2=1;
while(b[l2]>='A')
{
l2++;
scanf("%c", &b[l2]);
}
l2--;
d[1][0][l1+1]=1;
i=0;
for(w=0; w<(l1+l2)/2+(l1+l2)%2; w++)
{
memcpy(d[0], d[1], sizeof(d[0]));
memset(d[1], 0, sizeof(d[1]));
for(p1=0; p1<=l1; p1++)
{
for(q1=p1; q1<=l1+1; q1++)
{
p2=w-p1;
q2=l1-q1+1+l2-w+1;
if(p2<=q2)
{
// printf("*");
if(a[p1+1]==a[q1-1])
{
d[i+1][p1+1][q1-1]+=d[i][p1][q1];
if(d[i+1][p1+1][q1-1]>co) d[i+1][p1+1][q1-1]-=co;
}
if(a[p1+1]==b[q2-1])
{
d[i+1][p1+1][q1]+=d[i][p1][q1];
if(d[i+1][p1+1][q1]>co) d[i+1][p1+1][q1]-=co;
}
if(b[p2+1]==a[q1-1])
{
d[i+1][p1][q1-1]+=d[i][p1][q1];
if(d[i+1][p1][q1-1]>co) d[i+1][p1][q1-1]-=co;
}
if(b[p2+1]==b[q2-1])
{
d[i+1][p1][q1]+=d[i][p1][q1];
if(d[i+1][p1][q1]>co) d[i+1][p1][q1]-=co;
}
}
// printf("%d ", d[i][p1][q1]);
}
// printf("\n");
}
// printf("\n");
}
i=1;
w=(l1+l2)/2+(l1+l2)%2;
for(p1=0; p1<=l1; p1++)
{
for(q1=p1; q1<=p1+1; q1++)
{
p2=w-p1;
q2=l1-q1+1+l2-w+1;
if(q2-p2<=1 && p2<=q2)
{
{
sol+=d[i][p1][q1];
if(sol>co) sol-=co;
}
}
}
}
printf("%d\n", sol);
return 0;
}