Cod sursa(job #1812002)

Utilizator LucianTLucian Trepteanu LucianT Data 21 noiembrie 2016 19:23:00
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
#define maxN 505
#define MOD 3210121
using namespace std;
int n,m,i,j,k,dr,sol;
char a[maxN],b[maxN];
int dp[2][maxN][maxN];
int main()
{
    freopen("iv.in","r",stdin);
    freopen("iv.out","w",stdout);
    scanf("%s\n",a+1);n=strlen(a+1);
    scanf("%s",b+1);m=strlen(b+1);
    dp[0][0][0]=1;
    for(i=0;i<=n;i++)
        for(j=0;i+j<=n;j++)
            for(k=0;k<=m;k++)
            {
                dr=i+k-j;
                if(dr<0 || dr+k>m)
                    continue;
                if(i+j+k+dr==n+m || i+j+k+dr==n+m-1)
                {
                    sol=(sol+dp[i%2][j][k])%MOD;
                    continue;
                }
                if(a[i+1]==a[n-j])
                    dp[(i+1)%2][j+1][k]=(dp[(i+1)%2][j+1][k]+dp[i%2][j][k])%MOD;
                if(a[i+1]==b[m-dr])
                    dp[(i+1)%2][j][k]=(dp[(i+1)%2][j][k]+dp[i%2][j][k])%MOD;
                if(b[k+1]==a[n-j])
                    dp[i%2][j+1][k+1]=(dp[i%2][j+1][k+1]+dp[i%2][j][k])%MOD;
                if(b[k+1]==b[m-dr])
                    dp[i%2][j][k+1]=(dp[i%2][j][k+1]+dp[i%2][j][k])%MOD;
                dp[i%2][j][k]=0;
            }
    printf("%d",sol);
    return 0;
}