Cod sursa(job #46933)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 3 aprilie 2007 11:10:36
Problema Iv Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.65 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, xxx;

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