Cod sursa(job #2252650)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 2 octombrie 2018 21:35:05
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<bits/stdc++.h>
using namespace std;

const int maxN=1e3;
const int mod=3210121;

char s1[maxN],s2[maxN];
int dp[2][maxN][maxN];
inline void add(int &x,int y)
{
    x+=y;
    x%=mod;
}
int main()
{
    freopen("iv.in","r",stdin);
    freopen("iv.out","w",stdout);

    scanf("%s",s1+1);
    scanf("\n");
    scanf("%s",s2+1);

    int n=strlen(s1+1);
    int m=strlen(s2+1);

    int len=(n+m)>>1;

    dp[0][0][0]=1;

    for(int l=1;l<=len;l++)
    {
        int line=(l&1);
        for(int i=0;i<=l;i++)
            for(int k=0;k<=l;k++)
                dp[line][i][k]=0;

        for(int i=0;i<=min(l,n);i++)
        {
            int j=l-i;
            if(j>m) continue;

            for(int k=0;k<=l && (i+k)<=n;k++)
            {
                int t=l-k;
                if((j+t)>m) continue;
                if(i && k && s1[i]==s1[n-k+1]) add(dp[line][i][k],dp[!line][i-1][k-1]);
                if(i && t && s1[i]==s2[m-t+1]) add(dp[line][i][k],dp[!line][i-1][k]);
                if(j && k && s2[j]==s1[n-k+1]) add(dp[line][i][k],dp[!line][i][k-1]);
                if(j && t && s2[j]==s2[m-t+1]) add(dp[line][i][k],dp[!line][i][k]);
            }
        }
    }

    int sol=0;
    for(int i=0;i<=len;i++)
        for(int k=0;k<=len;k++)
            if((i+k)<=n) add(sol,dp[len&1][i][k]);

    printf("%d\n",sol);
    return 0;
}