Pagini recente » Monitorul de evaluare | Cod sursa (job #2912697) | Cod sursa (job #2419706) | Cod sursa (job #2872089) | Cod sursa (job #255091)
Cod sursa(job #255091)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxN 505
#define mod 3210121
int N, M;
int C[2][maxN][maxN];
char A[maxN], B[maxN];
int Sol = 0;
int main(){
int i, j, a, b;
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
gets(A + 1); A[0] = 'a'; N = strlen(A); N --;
gets(B + 1); B[0] = 'a'; M = strlen(B); M --;
//fprintf(stderr, "%d %d\n", N, M);
C[0][0][0] = 1; // initializez matricea pt dinamica
// fac dinamica
for (a = 1, b = 0; b < (N + M) >> 1; a ^= 1, b++){
for (i = 0; i <= N; ++i)
for (j = 0; j <= M; ++j)
C[a][i][j] = 0;
for (i = 0; i <= N; ++i)
for (j = 0; j <= N; ++j)
if (C[a ^ 1][i][j] != 0){
if (A[i + 1] == A[N - j] && i + 1 + j < N)
C[a][i + 1][j + 1] = (C[a][i + 1][j + 1] + C[a ^ 1][i][j]) % mod;
if (B[b - i + 1] == B[M - b + j] && (b << 1) < M + i + j - 1)
C[a][i][j] = (C[a][i][j] + C[a ^ 1][i][j]) % mod;
if (A[i + 1] == B[M - b + j] && i + j < N && (b << 1) < M + i + j)
C[a][i + 1][j] = (C[a][i + 1][j] + C[a ^ 1][i][j]) % mod;
if (B[b - i + 1] == A[N - j] && i + j < N && (b << 1) < M + i + j)
C[a][i][j + 1] = (C[a][i][j + 1] + C[a ^ 1][i][j]) % mod;
}
}
/* for (i = 1; i <= N; ++i){
for (j = 0; j <= N; ++j)
printf("%d ", C[i][j][0]);
puts("");
}*/
for (i = 0; i <= N; ++i)
for (j = 0; j <= N; ++j)
Sol = (Sol + C[a ^ 1][i][j]) % mod;
printf("%d\n", Sol);
}