Cod sursa(job #1470708)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 11 august 2015 22:32:35
Problema Iv Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("iv.in");
ofstream g("iv.out");
int N,M;
char A[505],B[505];
const int MOD = 3210121;
int DP[2][505][505];
void Read()
{
    f>>(A+1);
    f>>(B+1);
    N=strlen(A+1);
    M=strlen(B+1);
}
inline void add(int& x,int y)
{
    x+=y;
    while(x>=MOD)
        x-=MOD;
}
void Solve()
{
    int ind=1;
    DP[1][N][1]=1;
    int ans=0;
    for(int i=1;i<=N+1;i++)
    {
        for(int j=N;j>=0;j--)
        {
            for(int k=1;k<=M+1;k++)
            {
                int l=M+N+2-i-j-k;
                if(l<0 || l>M)
                {
                    DP[ind][j][k]=0;
                    continue;
                }
                if(i==j+1 && k==l+1)
                    add(ans,DP[ind][j][k]);
                if(j<i || k>l)
                {
                    DP[ind][j][k]=0;
                    continue;
                }
                if(A[i]==A[j] && j>0)
                    add(DP[1-ind][j-1][k],DP[ind][j][k]);
                if(B[k]==B[l])
                    add(DP[ind][j][k+1],DP[ind][j][k]);
                if(A[i]==B[l])
                   add(DP[1-ind][j][k],DP[ind][j][k]);
                if(A[j]==B[k] && j>0)
                    add(DP[ind][j-1][k+1],DP[ind][j][k]);
                DP[ind][j][k]=0;
            }
        }
        ind=1-ind;
    }
    g<<ans<<"\n";
}
int main()
{
    Read();
    Solve();
    return 0;
}