Cod sursa(job #66477)

Utilizator sealTudose Vlad seal Data 18 iunie 2007 22:59:13
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<stdio.h>
#include<string.h>
#define Nm 501
#define Mod 3210121
#define min(a,b) ((a)<(b)?(a):(b))
char A[Nm],B[Nm];
int Nr[2][Nm][Nm];

void read()
{
    freopen("iv.in","r",stdin);
    scanf("%s%s",A,B);
}

int pal(char A[], int l, int r)
{
    while(l<r)
        if(A[l++]!=A[r--])
            return 0;
    return 1;
}

int solve()
{
    int n,m,i,j,k,l,c,p;

    n=strlen(A);
    m=strlen(B);

    c=0; p=1; i=n+m>>1;
    for(i=min(i,n);i>=0;--i)
    {
        j=(n+m>>1)-i;
        for(j=min(j,m);j>=0;--j)
        {
            k=i+j;
            for(k=min(k,n-i);k>=0;--k)
            {
                l=i+j-k;
                if(l+j>m)
                    break;
                if(i+k==n)
                    Nr[c][j][k]=pal(B,j,m-l-1);
                else
                    if(j+l==m)
                        Nr[c][j][k]=pal(A,i,n-k-1);
                    else
                    {
                        Nr[c][j][k]=0;
                        if(i<n-k-1 && A[i]==A[n-k-1])
                            Nr[c][j][k]+=Nr[p][j][k+1];
                        if(A[i]==B[m-l-1])
                        {
                            Nr[c][j][k]+=Nr[p][j][k];
                            if(Nr[c][j][k]>=Mod)
                                Nr[c][j][k]-=Mod;
                        }
                        if(B[j]==A[n-k-1])
                        {
                            Nr[c][j][k]+=Nr[c][j+1][k+1];
                            if(Nr[c][j][k]>=Mod)
                                Nr[c][j][k]-=Mod;
                        }
                        if(j<m-l+1 && B[j]==B[m-l-1])
                        {
                            Nr[c][j][k]+=Nr[c][j+1][k];
                            if(Nr[c][j][k]>=Mod)
                                Nr[c][j][k]-=Mod;
                        }
                    }
            }
        }
        c^=1; p^=1;
    }
    return Nr[p][0][0];
}

void write(int s)
{
    freopen("iv.out","w",stdout);
    printf("%d\n",s);
}

int main()
{
    read();
    write(solve());
    return 0;
}