Cod sursa(job #255168)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 8 februarie 2009 19:06:31
Problema Iv Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <stdio.h>
#include <string>

#define maxn 510
using namespace std;

long d[2][maxn][maxn];
long n, i, j, k, l1, l2, sol, l, p1, p2, q1, q2, w;
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][l1+1]=1;
    i=0;
    for(w=0; w<(l1+l2)/2+(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=p1; q1<=l1+1; q1++)
            {
                p2=w-p1;
                q2=l1-q1+1+l2-w+1;
                if(p2<=q2)
                {
                  //  printf("*");
                    if(a[p1+1]==a[q1-1])
                    {
                        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(a[p1+1]==b[q2-1])
                    {
                        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[p2+1]==a[q1-1])
                    {
                        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;
                    }
                    if(b[p2+1]==b[q2-1])
                    {
                        d[i+1][p1][q1]+=d[i][p1][q1];
                        if(d[i+1][p1][q1]>co) d[i+1][p1][q1]-=co;
                    }
                }
           //     printf("%d ", d[i][p1][q1]);
            }
      //      printf("\n");
        }
     //   printf("\n");
    }
    i=1;
    w=(l1+l2)/2+(l1+l2)%2;
    for(p1=0; p1<=l1; p1++)
    {
        for(q1=p1; q1<=p1+1; q1++)
        {
            p2=w-p1;
            q2=l1-q1+1+l2-w+1;
            if(q2-p2<=1 && p2<=q2)
            {
                {
                    sol+=d[i][p1][q1];
                    if(sol>co) sol-=co;
                }
            }
        }
    }
    printf("%d\n", sol);
    return 0;
}