Cod sursa(job #2049823)

Utilizator Bodo171Bogdan Pop Bodo171 Data 27 octombrie 2017 18:01:03
Problema Iv Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
using namespace std;
const int nmax=505;
const int mod=3210121;
string a,b;
int modes[2][nmax][nmax];
int val,n,m,i,j,k,use,len,st,dr,tot;
void prp(int A,int B)
{
    modes[1-use][A][B]+=val;
    if(modes[1-use][A][B]>=mod)
        modes[1-use][A][B]-=mod;
}
int main()
{
    ifstream f("iv.in");
    ofstream g("iv.out");
    f>>a>>b;
    n=a.size();m=b.size();
    a=" "+a;b=" "+b;len=(n+m)/2;
    modes[0][0][0]=1;
    for(i=0;i<len;i++)
    {
        for(j=0;j<=min(n,i);j++)
            for(k=0;k<=min(n-j,i);k++)
                modes[1-use][j][k]=0;
        for(j=0;j<=min(n,i);j++)
            for(k=0;k<=min(n-j,i);k++)
                if(modes[use][j][k])
        {
            val=modes[use][j][k];
            st=i-j;dr=i-k;
            if(st<=m-dr+1)
            {
            if(a[j+1]==a[n-k])
                prp(j+1,k+1);
            if(dr<m&&a[j+1]==b[m-dr])
                prp(j+1,k);
            if(st<m&&b[st+1]==a[n-k])
                prp(j,k+1);
            if(st<m&&dr<m&&st+dr+2<=m&&b[st+1]==b[m-dr])
                prp(j,k);
            }
        }
        use=1-use;
    }
     for(j=0;j<=min(n,i);j++)
            for(k=0;k<=min(n-j,i);k++)
                if(modes[use][j][k])
        {
            tot+=modes[use][j][k];
            if(tot>=mod)
                tot-=mod;
        }
    g<<tot;
    return 0;
}