Cod sursa(job #255188)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 8 februarie 2009 19:51:12
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <stdio.h>
#include <string>

#define maxn 520
using namespace std;

long d[2][maxn][maxn];
long n, i, j, k, l1, l2, sol, l, p1, p2, q1, q2, w, poz;
char a[maxn], b[maxn];
const long co=3210121;

int main()
{
    freopen("iv.in", "r", stdin);
    freopen("iv.out", "w", stdout);
    scanf("%c", &a[1]);
    l1=1;
    while(a[l1]>='A')
    {
        l1++;
        scanf("%c", &a[l1]);
    }
    l1--;
    scanf("%c", &b[1]);
    l2=1;
    while(b[l2]>='A')
    {
        l2++;
        scanf("%c", &b[l2]);
    }
    l2--;
    d[1][0][0]=1;
    i=0;
    for(w=0; w<=(l1+l2)/2; w++)
    {
        
        memcpy(d[0], d[1], sizeof(d[0]));
        memset(d[1], 0, sizeof(d[1]));
        
        for(p1=0; p1<=l1; p1++)
        {
            for(q1=0; q1<=l1; q1++)
            {
                if(d[0][p1][q1])
                {
                    if(a[p1+1]==a[l1-q1] && p1+1<l1-q1)
                    {
                        d[i+1][p1+1][q1+1]+=d[i][p1][q1];
                        if(d[i+1][p1+1][q1+1]>co) d[i+1][p1+1][q1+1]-=co;
                    }
                    
                    if(b[w-p1+1]==b[l2-w+q1] && w-p1+1<l2-w+q1)
                    {
                        d[i+1][p1][q1]+=d[i][p1][q1];
                        if(d[i+1][p1][q1]>co) d[i+1][p1][q1]-=co;
                    }
                    
                    if(a[p1+1]==b[l2-w+q1] && p1<l1-q1 && w-p1<l2-w+q1)
                    {
                        d[i+1][p1+1][q1]+=d[i][p1][q1];
                        if(d[i+1][p1+1][q1]>co) d[i+1][p1+1][q1]-=co;
                    }
                    
                    if(b[w-p1+1]==a[l1-q1] && p1<l1-q1 && w-p1<l2-w+q1)
                    {
                        d[i+1][p1][q1+1]+=d[i][p1][q1];
                        if(d[i+1][p1][q1+1]>co) d[i+1][p1][q1+1]-=co;
                    }
                }
             //   printf("%d ", d[0][p1][q1]);
            }
         //   printf("\n");
        }
    //    printf("\n");
    }
    i=0;
    w=(l1+l2)/2;
    for(p1=0; p1<=l1; p1++)
    {
        for(q1=0; q1<=l1; q1++)
        {
            sol+=d[i][p1][q1];
            sol%=co;
        }
    }
    printf("%d\n", sol);
    return 0;
}