Cod sursa(job #2275987)

Utilizator patcasrarespatcas rares danut patcasrares Data 3 noiembrie 2018 20:37:04
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
const int DN=505,M=3210121;
int n,m,dp[3][DN][DN],t0=0,t1=1,t2=2,f1,g1,f2,g2,pozf1,pozf2,pozg2,pozg1,f,ma,vf1,vf2;
char a[DN],b[DN];
int main()
{
    //cout<<sizeof(dp)/1000;
    fin.getline(a+1,DN);
    fin.getline(b+1,DN);
    n=strlen(a+1);
    m=strlen(b+1);
    for(int l=0;l<=n+m;l++)
    {
        if(l==0)
        {
            for(int i=0;i<=n;i++)
                dp[t2][i][n-i]=1;
            t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
            continue;
        }
        if(l==1)
        {
            for(int i=0;i<=n;i++)
                dp[t2][i][n-i]=1;
            for(int i=0;i<n;i++)
                dp[t2][i][n-i-1]=(dp[t2][i][n-i-1]+1)%M;
            t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
            continue;
        }
        f=n+m-l;
        if(f%2)
        {
            t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
            continue;
        }
        f/=2;
        for(int i=0;i<=f;i++)
        {
            f1=i;
            g1=f-i;
            pozg1=g1+1;
            pozf1=f1+1;
            for(int j=0;j<=f;j++)
                dp[t2][i][j]=0;
            for(int j=0;j<=f;j++)
            {
                f2=j;
                pozf2=n-f2;
                g2=f-f2;
                pozg2=m-g2;
              //  cout<<i<<' '<<j<<' '<<pozf1<<' '<<pozf2<<' '<<pozg1<<' '<<pozg2<<'\n';
                if(f1+f2>n)
                    continue;
                if(g1+g2>m)
                    continue;
                vf1=vf2=1;
                if(f1+f2==n)
                    vf1=0;
                if(g1+g2==m)
                    vf2=0;
                if(pozf1<=n&&pozf2>0)
                    if(vf1)
                    if(a[pozf1]==a[pozf2]&&pozf1!=pozf2)
                        dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1+1][f2+1])%M;
                if(pozf1<=n&&pozg2>0)
                    if(vf1&&vf2)
                    if(a[pozf1]==b[pozg2])
                    {
                        dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1+1][f2])%M;
                    }

                if(pozg1<=m&&pozf2>0)
                    if(vf2&&vf1)
                    if(b[pozg1]==a[pozf2])
                        dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1][f2+1])%M;
                if(pozg1<=m&&pozg2>0)
                    if(vf2)
                    if(b[pozg1]==b[pozg2]&&pozg1!=pozg2)
                        dp[t2][f1][f2]=(dp[t2][f1][f2]+dp[t0][f1][f2])%M;
                ma=max(ma,dp[t2][f1][f2]);
            }
        }
        t0++;t1++;t2++;t0%=3;t1%=3;t2%=3;
    }
    fout<<dp[t1][0][0];
}