Cod sursa(job #918177)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 17:57:34
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 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;
}