Cod sursa(job #1508592)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 22 octombrie 2015 18:57:00
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <cstring>
#define nmax 505
#define mod 3210121
using namespace std;
int n,m,sol;
int d[2][nmax][nmax];
char a[nmax],b[nmax];

int main()
{
    freopen("iv.in","r",stdin);
    freopen("iv.out","w",stdout);
    gets(a+1);
    gets(b+1);
    n=strlen(a+1);
    m=strlen(b+1);
    d[0][0][n+1]=1;
    int sum,p1,p2,q1,q2,x;


    for (p1=0;p1<=n;p1++) {

        for (p2=0;p2<=m;p2++)
            for (q1=n+1;q1>=p1;q1--) {

            q2=m+n-q1-p1-p2+2;
            if (q2<0||q2>m+1||q2<p2)
                continue;

            d[p1&1][p2][q1]%=mod;
            x=d[p1&1][p2][q1];

            if (p1+1<q1-1&&a[p1+1]==a[q1-1])

                d[(p1+1)&1][p2][q1-1]+=x;

            if (p1+1<q1&&p2<q2-1&&a[p1+1]==b[q2 - 1])

                d[(p1+1)&1][p2][q1]+=x;


            if (p1<q1-1&&p2+1<q2&&a[q1-1]==b[p2 + 1])

                d[p1&1][p2+1][q1-1]+=x;

            if (p2+1<q2-1&&b[p2+1]==b[q2 - 1])

                d[p1&1][p2+1][q1]+=x;

            if ((p1+1==q1&&p2+1==q2)||((p1+1==q1-1&&p2+1==q2)||(p2+1==q2-1&&p1+1==q1))) {

                sol+=x;
                if (sol>mod)
                    sol-=mod;
            }
        }
    memset(d[p1&1],0,sizeof(d[p1&1]));
    }
    printf("%d\n",sol);
    return 0;
}