Cod sursa(job #41046)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 27 martie 2007 22:04:17
Problema Iv Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <string.h>
#define NMAX 32
#define mod(a) ((a) >= 3210121 ? ((a)-3210121):(a))

int DP[NMAX][NMAX][NMAX][NMAX], N, M;
int A[NMAX], B[NMAX];
char a[NMAX], b[NMAX];

int main()
{
        int i, j, k, l, sol = 0;

        freopen("iv.in", "r", stdin);
        gets(a); gets(b);
        N = strlen(a); M = strlen(b);
        for (i = 1; i <= N; i++)
            A[i] = (int)a[i-1];
        for (i = 1; i <= M; i++)
            B[i] = (int)b[i-1];

        DP[0][0][0][0] = 1;
        for (i = 0; i <= N; i++)
             for (j = 0; j <= N; j++)
                 for (k = 0; k <= M; k++)
                     for (l = 0; l <= M; l++)
                     {
                         if (A[i+1] == B[k+1]) DP[i+1][j][k+1][l] = 2*mod(DP[i+1][j][k+1][l]+DP[i][j][k][l]);
                         if (A[i+1] == B[M-l]) DP[i+1][j][k][l+1] = 2*mod(DP[i+1][j][k][l-1]+DP[i][j][k][l]);
                         if (A[N-j] == B[k+1]) DP[i][j+1][k+1][l] = 2*mod(DP[i][j-1][k+1][l]+DP[i][j][k][l]);
                         if (A[N-j] == B[M-l]) DP[i][j+1][k][l+1] = 2*mod(DP[i][j-1][k][l-1]+DP[i][j][k][l]);
                     }
 
         for (i = 1; i <= N; i++)
             for (j = 1; j <= N; j++)
                 for (k = 1; k <= M; k++)
                     for (l = 1; l <= M; l++)
                         if (i+j+k+l == N+M) sol += DP[i][j][k][l];
 
        freopen("iv.out", "w", stdout);
        printf("%d\n", sol);
                    
        return 0;
        
}