Pagini recente » Cod sursa (job #64591) | Cod sursa (job #1370851) | Cod sursa (job #2172121) | Cod sursa (job #2153586) | Cod sursa (job #834212)
Cod sursa(job #834212)
//Implementare de kkt.
#include <stdio.h>
#include <string.h>
#define MOD 3210121
int dp[2][512][512];
char x[512], y[512];
void baga(int &A, int B)
{
A += B;
if (A >= MOD)
A = A - MOD;
}
int main()
{
int i, j, k, N, M, sol = 0;
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
gets(x + 1); gets(y + 1);
N = strlen(x + 1); M = strlen(y + 1);
dp[0][0][0] = 1;
for (i = 0; i <= N; i ++)
{
for (j = 0; i + j <= N; j ++)
for (k = 0; k <= M; k ++)
{
int right = i + k - j;
if (right < 0 || k + right > M)
continue;
if (i + j + k + right == N + M || i + j + k + right == N + M - 1)
{
sol += dp[i & 1][j][k];
continue;
}
if (x[i + 1] == x[N - j] && i + 1 != N - j)
baga(dp[(i + 1) & 1][j + 1][k], dp[i & 1][j][k]);
if (M - right >= 1 && x[i + 1] == y[M - right])
baga(dp[(i + 1) & 1][j][k], dp[i & 1][j][k]);
if (y[k + 1] == x[N - j])
baga(dp[i & 1][j + 1][k + 1], dp[i & 1][j][k]);
if (M - right >= 1 && y[k + 1] == y[M - right] && k + 1 != M - right)
baga(dp[i & 1][j][k + 1], dp[i & 1][j][k]);
}
for (j = 0; j <= N; j ++)
for (k = 0; k <= M; k ++)
dp[i & 1][j][k] = 0;
}
printf("%d", sol);
return 0;
}