Cod sursa(job #842119)

Utilizator stoicatheoFlirk Navok stoicatheo Data 26 decembrie 2012 10:31:19
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <fstream>
#include <cstring>

using namespace std;

const char InFile[]="iv.in";
const char OutFile[]="iv.out";
const int MaxN=512;
const int MOD=3210121;

ifstream fin(InFile);
ofstream fout(OutFile);

int N,M,D1[MaxN][MaxN],D2[MaxN][MaxN];
char str1[MaxN],str2[MaxN];

inline void MODf(int &x)
{
    if(x>=MOD)
    {
        x-=MOD;
    }
}

int main()
{
    fin>>str1+1>>str2+1;
    fin.close();

    N=strlen(str1+1);
    M=strlen(str2+1);

    D1[0][0]=1;
    int side=(N+M)>>1;
    for(register int i=0;i<side;++i)
    {
        for(register int st1=0;st1<=i;++st1)
        {
            for(register int dr1=0;dr1<=i && st1+dr1<=N;++dr1)
            {
                int st2=i-st1;
                int dr2=i-dr1;
                if(st1+dr1<N)
                {
                    if(st1+dr1<N-1)
                    {
                        if(str1[st1+1]==str1[N-dr1])
                        {
                            D2[st1+1][dr1+1]+=D1[st1][dr1];
                            MODf(D2[st1+1][dr1+1]);
                        }
                    }

                    if(st2+dr2<M)
                    {
                        if(str1[st1+1]==str2[M-dr2])
                        {
                            D2[st1+1][dr1]+=D1[st1][dr1];
                            MODf(D2[st1+1][dr1]);
                        }
                    }
                }

                if(st2+dr2<M)
                {
                    if(st2+dr2<M-1)
                    {
                        if(str2[st2+1]==str2[M-dr2])
                        {
                            D2[st1][dr1]+=D1[st1][dr1];
                            MODf(D2[st1][dr1]);
                        }
                    }

                    if(st1+dr1<N)
                    {
                        if(str2[st2+1]==str1[N-dr1])
                        {
                            D2[st1][dr1+1]+=D1[st1][dr1];
                            MODf(D2[st1][dr1+1]);
                        }
                    }
                }
            }
        }
        for(register int st1=0;st1<=i+1;++st1)
        {
            for(register int dr1=0;dr1<=i+1 && st1+dr1<=N;++dr1)
            {
                D1[st1][dr1]=D2[st1][dr1];
                D2[st1][dr1]=0;
            }
        }
    }

    int sol=0;
    for(register int st1=0;st1<=side;++st1)
    {
        for(register int dr1=0;dr1<=side && st1+dr1<=N;++dr1)
        {
            sol+=D1[st1][dr1];
            MODf(sol);
        }
    }

    fout<<sol;
    fout.close();
    return 0;
}