Cod sursa(job #255092)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 8 februarie 2009 16:54:00
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#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++){

        memset(C[a], 0, sizeof(C[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);

}