Cod sursa(job #1008002)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 10 octombrie 2013 00:23:59
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#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)
                {
                    baga(sol, dp[i & 1][j][k]);
                    continue;
                }

                if (x[i + 1] == x[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])
                    baga(dp[i & 1][j][k + 1], dp[i & 1][j][k]);
                dp[i & 1][j][k] = 0;
            }
    }

    printf("%d", sol);
    return 0;
}