Cod sursa(job #2275947)

Utilizator patcasrarespatcas rares danut patcasrares Data 3 noiembrie 2018 19:54:10
Problema Iv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 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;
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++)
            {
                f2=j;
                pozf2=n-f2;
                g2=f-f2;
                pozg2=m-g2;
                if(pozf2<0)
                    break;
                if(pozg2<0)
                    break;
                if(pozg2<pozg1||pozf2<pozf1)
                    continue;
                if(pozf1<=n&&pozf2>0)
                    if(a[pozf1]==a[pozf2]&&pozf1!=pozf2)
                        dp[t2][f1][g1]=(dp[t2][f1][g1]+dp[t0][f1+1][g1+1])%M;
                if(pozf1<=n&&pozg2>0)
                    if(a[pozf1]==b[pozg2])
                    {
                        dp[t2][f1][g1]=(dp[t2][f1][g1]+dp[t0][f1+1][g1])%M;
                    }

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