Cod sursa(job #2205503)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 19 mai 2018 13:17:35
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<fstream>
#include<string.h>
#define MOD 3210121
using namespace std;
ifstream fi("iv.in");
ofstream fo("iv.out");
int n,m,i,j,k,ind,Dp[2][505][505],cr,rez,l;
char A[505],B[505];
int main()
{
    fi>>(A+1);
    n=strlen(A+1);
    fi>>(B+1);
    m=strlen(B+1);
    Dp[0][0][0]=1;
    for(i=0; i<=n; i++)
    {
        cr=i%2;
        for(j=0; j<=m; j++)
        {
            for(k=0; k<=n-i; k++)
            {
                if(Dp[cr][j][k]==0)
                    continue;
                ind=i+j-k;
                if(ind<0 && ind<=m-j)
                    continue;
                if(A[i+1]==A[n-k] && i+1<n-k)
                    Dp[1-cr][j][k+1]=(Dp[1-cr][j][k+1]+Dp[i][j][k])%MOD;
                if(A[i+1]==B[m-ind])
                    Dp[1-cr][j][k]=(Dp[1-cr][j][k]+Dp[i][j][k])%MOD;
                if(B[j+1]==A[n-k])
                    Dp[cr][j+1][k+1]=(Dp[cr][j+1][k+1]+Dp[i][j][k])%MOD;
                if(B[j+1]==B[m-ind] && j+1<m-ind)
                    Dp[cr][j+1][k]=(Dp[cr][j+1][k]+Dp[i][j][k])%MOD;
                l=i+j+k+ind;
                if(n%2!=m%2)
                    l++;
                if(l==n+m)
                    rez=(rez+Dp[cr][j][k])%MOD;
                Dp[cr][j][k]=0;
            }
        }
    }
    fo<<rez<<"\n";
    fi.close();
    fo.close();
    return 0;
}