Cod sursa(job #594038)

Utilizator SpiderManSimoiu Robert SpiderMan Data 5 iunie 2011 22:58:08
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
# include <cstdio>
# include <cstring>

# define C  (M + N >> 1)
# define i1 (i & 1)
# define i2 (!(i & 1))

const char *FIN = "iv.in", *FOU = "iv.out" ;
const int MAX = 510, MOD = 3210121 ;

char A[MAX], B[MAX] ;
int dp[2][MAX][MAX] ;
int N, M, sol ;

inline void caz (int CAZ, int i, int j, int k) {
    if (CAZ == 1) {
        if (j > 0 && N - k + 1 <= N && A[j] == A[N - k + 1]) {
            dp[i1][j][k] += dp[i2][j - 1][k - 1] ;
        }
    } else if (CAZ == 2) {
        if (j > 0 && M - i + k + 1 <= M && A[j] == B[M - i + k + 1]) {
            dp[i1][j][k] += dp[i2][j - 1][k] ;
        }
    } else if (CAZ == 3) {
        if (i - j > 0 && N - k + 1 <= N && B[i - j] == A[N - k + 1]) {
            dp[i1][j][k] += dp[i2][j][k - 1] ;
        }
    } else {
        if (i - j > 0 && M - i + k + 1 <= M && B[i - j] == B[M - i + k + 1]) {
            dp[i1][j][k] += dp[i2][j][k] ;
        }
    }
    dp[i1][j][k] %= MOD ;
}

int main (void) {
    fscanf (fopen (FIN, "r"), "%s %s", A + 1, B + 1) ;
    N = strlen (A + 1), M = strlen (B + 1);
    dp[1][1][1] = (A[1] == A[N] ? 1 : 0) ;
    dp[1][1][0] = (A[1] == B[M] ? 1 : 0) ;
    dp[1][0][1] = (B[1] == A[N] ? 1 : 0) ;
    dp[1][0][0] = (B[1] == B[M] ? 1 : 0) ;
    for (int i = 2; i <= C; ++i) {
        for (int j = 0; j <= i; ++j) {
            for (int k = 0; k <= i; ++k) {
                dp[i1][j][k] = 0;
                if (j + k <= N && i - j + i - k <= M) {
                    caz (1, i, j, k), caz (2, i, j, k), caz (3, i, j, k), caz (4, i, j, k);
                }
            }
        }
    }
    for (int i = 0; i <= C; ++i) {
        for (int j = 0; j <= C; ++j) {
            sol += dp[C & 1][i][j], sol %= MOD ;
        }
    }
    fprintf (fopen (FOU, "w"), "%d", sol) ;
}