Cod sursa(job #1811998)

Utilizator LucianTLucian Trepteanu LucianT Data 21 noiembrie 2016 19:19:45
Problema Iv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <bits/stdc++.h>
#define maxN 505
#define MOD 666013
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(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;
            }
    for(i=0;i<=n;i++)
        for(j=0;i+j<=n;j++)
            sol=(sol+dp[n%2][i][j])%MOD;
    printf("%d",sol);
    return 0;
}