Cod sursa(job #166232)

Utilizator filipbFilip Cristian Buruiana filipb Data 27 martie 2008 18:12:54
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#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;
}