Pagini recente » Cod sursa (job #2097592) | Cod sursa (job #1212969) | Cod sursa (job #191806) | Cod sursa (job #1945549) | Cod sursa (job #166232)
Cod sursa(job #166232)
#include <stdio.h>
#include <string.h>
#define MOD 3210121
#define aduna(x, y) (((x += y) >= MOD) ? (x -= MOD) : (0))
int M, N, L, D[2][505][505], cnt;
char X[505], Y[505];
int main(void)
{
int i, j, k, p, crt = 0, prev = 1;
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
scanf("%s", X);
scanf("%s", Y);
M = strlen(X);
N = strlen(Y);
for (i = M; i; --i) X[i] = X[i-1]; X[0] = '!';
for (i = N; i; --i) Y[i] = Y[i-1]; Y[0] = '?';
X[M+1] = '.'; Y[N+1] = ',';
L = M+N - ((M+N) & 1);
L /= 2;
D[0][0][0] = 1;
for (i = 0; i <= M; ++i)
{
for (j = (i == 0); j <= N; ++j)
for (k = 0; i+k <= M; ++k)
{
D[crt][j][k] = 0;
p = i+j-k;
if (X[i] == Y[N-p+1])
aduna(D[crt][j][k], D[prev][j][k]);
if (X[i] == X[M-k+1])
aduna(D[crt][j][k], D[prev][j][k-1]);
if (Y[j] == Y[N-p+1])
aduna(D[crt][j][k], D[crt][j-1][k]);
if (Y[j] == X[M-k+1])
aduna(D[crt][j][k], D[crt][j-1][k-1]);
}
crt ^= 1; prev ^= 1;
if (L - i < 0 || L - i > N) continue;
if ((M+N) & 1)
{
aduna(cnt, D[prev][L-i][M-i]); // caracterul din mijloc din B
if (i < M)
aduna(cnt, D[prev][L-i][M-i-1]); // // caracterul din mijloc din A
}
else
aduna(cnt, D[prev][L-i][M-i]);
}
printf("%d\n", cnt);
return 0;
}