Pagini recente » Cod sursa (job #2487193) | Cod sursa (job #403030) | Cod sursa (job #1401005) | Cod sursa (job #404418) | Cod sursa (job #1480984)
#include <cstdio>
#include <cstring>
using namespace std;
const int Nmax = 500;
const int Mod = 3210121;
char A[Nmax+5], B[Nmax+5];
int d[2][Nmax+2][Nmax+2];
void Add(int& a,int& b)
{
a += b;
if (a >= Mod)
a -= Mod;
}
int main()
{
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
gets(A+1);
gets(B+1);
int n = strlen(A+1);
int m = strlen(B+1);
int Sol = 0;
d[0][0][n+1] = 1;
int p = 0;
bool nd = n&1;
bool md = m&1;
for (int i = 0; i <= n; ++i, p ^= 1)
{
for (int j = 0; j <= m; ++j)
{
for (int ii = n + 1; ii >= i && ii > 0; --ii)
{
int jj = n + m + 2 - i - j - ii;
if (jj <= 0 || jj > m + 1 || jj < j)
continue;
if (i+1 < ii-1 && A[i+1] == A[ii-1]) Add(d[p^1][j][ii-1],d[p][j][ii]);
if (j+1 < jj-1 && B[j+1] == B[jj-1]) Add(d[p][j+1][ii],d[p][j][ii]);
if (i+1 < ii && jj-1 > j && A[i+1] == B[jj-1]) Add(d[p^1][j][ii],d[p][j][ii]);
if (j+1 < jj && ii-1 > i && B[j+1] == A[ii-1]) Add(d[p][j+1][ii-1],d[p][j][ii]);
if ((i+1 == ii && j+1 == jj) || ((i+1 == ii-1 && j+1 == jj) || (j+1 == jj-1 && i+1 == ii)))
Add(Sol,d[p][j][ii]);
}
}
memset(d[p],0,sizeof d[p]);
}
printf("%d\n",Sol);
}