Pagini recente » Cod sursa (job #244142) | Cod sursa (job #272624) | Cod sursa (job #3033079) | Cod sursa (job #2775104) | Cod sursa (job #1507875)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 3210121
#define maxN 502
int n, m, dp[2][maxN][maxN], p1, p2, q1, q2, sol;
char a[maxN], b[maxN];
void read()
{
freopen("iv.in", "r", stdin);
gets(a + 1);
gets(b + 1);
n = strlen(a + 1);
m = strlen(b + 1);
}
void add(int x, int &y)
{
y += x;
if (y >= mod)
y -= mod;
}
void solve()
{
dp[0][0][n + 1] = 1;
for (p1 = 0; p1 <= n; ++ p1)
{
for (p2 = 0; p2 <= m; ++ p2)
for (q1 = n + 1; q1 >= p1; -- q1)
{
q2 = m + n - q1 - p1 - p2 + 2;
if (q2 < 0 || q2 > m + 1 || q2 < p2)
continue;
if (p1 + 1 < q1 - 1 && a[p1 + 1] == a[q1 - 1])
add(dp[p1 & 1][p2][q1], dp[(p1 + 1) & 1][p2][q1 - 1]);
if (p1 + 1 < q1 && p2 < q2 - 1 && a[p1 + 1] == b[q2 - 1])
add(dp[p1 & 1][p2][q1], dp[(p1 + 1) & 1][p2][q1]);
if (p1 < q1 - 1 && p2 + 1 < q2 && a[q1 - 1] == b[p2 + 1])
add(dp[p1 & 1][p2][q1], dp[p1 & 1][p2 + 1][q1 - 1]);
if (p2 + 1 < q2 - 1 && b[p2 + 1] == b[q2 - 1])
add(dp[p1 & 1][p2][q1], dp[p1 & 1][p2 + 1][q1]);
if ((p1 + 1 == q1 && p2 + 1 == q2) || ((p1 + 1 == q1 - 1 && p2 + 1 == q2) || (p2 + 1 == q2 - 1 && p1 + 1 == q1)))
add(dp[p1 & 1][p2][q1], sol);
}
memset(dp[p1 & 1], 0, sizeof(dp[p1 & 1]));
}
}
void write()
{
freopen("iv.out", "w", stdout);
printf("%d", sol);
}
int main()
{
read();
solve();
write();
return 0;
}