Cod sursa(job #1998363)

Utilizator victoreVictor Popa victore Data 7 iulie 2017 16:18:17
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<cstring>

using namespace std;

const int nmax=505;
const int mod=3210121;

char a[nmax],b[nmax];

int d[2][nmax][nmax];

int main()
{
    freopen("iv.in","r",stdin);
    freopen("iv.out","w",stdout);
    int i,j,k,l,m,n,rez=0,pre,cu;
    gets(a+1);
    gets(b+1);
    n=strlen(a+1);
    m=strlen(b+1);
    d[0][0][n+1]=1;
    for(i=0;i<=n;++i)
    {
        cu=i&1;
        pre=(i&1)^1;
        for(j=0;j<=m;++j)
            for(k=n+1;k>=i;--k)
            {
                l=n+m+2-k-i-j;
                if(l < 0 || l > m+1 || l < j)
                    continue;
                d[cu][j][k] %= mod;
                if(i+1 < k-1 && a[i+1] == a[k-1])
                    d[pre][j][k-1]+=d[cu][j][k];
                if(k-1 > i && j+1 < l && a[k-1]==b[j+1])
                    d[cu][j+1][k-1]+=d[cu][j][k];
                if(i+1 < k && l-1 > j && a[i+1]==b[l-1])
                    d[pre][j][k]+=d[cu][j][k];
                if(j+1 < l-1 && b[j+1]==b[l-1])
                    d[cu][j+1][k]+=d[cu][j][k];
                if((i+1 == k && j+1 == l) || (i+2 == k && j+1 ==l) || (i+1 == k && j+2 == l))
                {
                    rez+=d[cu][j][k];
                    if(rez >= mod)
                        rez-=mod;
                }
            }
        memset(d[cu] , 0 , sizeof(d[cu]));
    }
    rez %= mod;
    printf("%d",rez);
}