Cod sursa(job #1723911)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 1 iulie 2016 20:17:08
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<cstring>
#define MAXN 510
#define MOD 3210121
using namespace std;
char a[MAXN],b[MAXN];
int dp[2][MAXN][MAXN];
int main(){
    freopen("iv.in","r",stdin);
    freopen("iv.out","w",stdout);
    int n,m,i,j,k,l,p=0,q=1,answer=0;
    scanf("%s%s",a+1,b+1);
    n=strlen(a+1);
    m=strlen(b+1);
    dp[0][0][n+1]=1;
    for(i=0;i<=n;i++){
        for(j=0;j<=m;j++)
            for(k=n+1;k>=i;k--){
                l=n-k+1+m+1-i-j;
                if(l<0||l>m+1||l<j)
                    continue;
                dp[p][j][k]%=MOD;
                if(i+2<k&&a[i+1]==a[k-1])
                    dp[q][j][k-1]+=dp[p][j][k];
                if(i+1<k&&j+1<l&&a[i+1]==b[l-1])
                    dp[q][j][k]+=dp[p][j][k];
                if(i+1<k&&j+1<l&&a[k-1]==b[j+1])
                    dp[p][j+1][k-1]+=dp[p][j][k];
                if(j+2<l&&b[j+1]==b[l-1])
                    dp[p][j+1][k]+=dp[p][j][k];
                if((i+1==k&&j+1==l)||(i+2==k&&j+1==l)||(i+1==k&&j+2==l)){
                    answer+=dp[p][j][k];
                    if(answer>=MOD)
                        answer-=MOD;
                }
            }
        memset(dp[p],0,sizeof(dp[p]));
        p^=1;
        q^=1;
    }
    printf("%d",answer);
    return 0;
}