Cod sursa(job #2483926)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 30 octombrie 2019 15:55:42
Problema Iv Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>
#include <cstring>
#define DIM 510
#define mod 3210121
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
int i,j,l1,l2,t,L,sol,d[DIM][DIM][DIM];
char A[DIM],B[DIM];
int main() {
    fin>>A+1>>B+1;
    l1=strlen(A+1);
    l2=strlen(B+1);
    if (A[1]==A[l1])
        d[0][1][1]=1;
    if (A[1]==B[l2])
        d[0][1][0]=1;
    if (B[1]==B[l2])
        d[0][0][0]=1;
    if (B[1]==A[l1])
        d[0][0][1]=1;
    t=1;
    for (L=2;L<=(l1+l2)/2;L++) {        //d[t][i][j]=nr de palindromuri la pasul t cu primele
        for (i=0;i<=l1&&i<=L;i++) {     //i litere din A si ultimele j din A(adica primele
            for (j=0;j<=l2&&j<=L;j++) { //L-i din B si ultimele L-j din B
                d[t][i][j]=0;
                if (i>0&&j>0&&A[i]==A[l1-j+1]) {
                    d[t][i][j]+=d[1-t][i-1][j-1];
                    if (d[L][i][j]>=mod)
                        d[L][i][j]-=mod;
                }
                if (i>0&&j<L&&A[i]==B[l2-L+j+1]) {
                    d[t][i][j]+=d[1-t][i-1][j];
                    if (d[L][i][j]>=mod)
                        d[L][i][j]-=mod;
                }
                if (i<L&&j>0&&B[L-i]==A[l1-j+1]) {
                    d[t][i][j]+=d[1-t][i][j-1];
                    if (d[L][i][j]>=mod)
                        d[L][i][j]-=mod;
                }
                if (i<L&&j<L&&B[L-i]==B[l2-L+j+1]) {
                    d[t][i][j]+=d[1-t][i][j];
                    if (d[L][i][j]>=mod)
                        d[L][i][j]-=mod;
                }
            }
        }
        t=1-t;
    }
    t=1-t;
    if ((l1+l2)%2==0) {
        for (i=0;i<=l1;i++) {
            sol+=d[t][i][l1-i];
            if (sol>=mod)
                sol-=mod;
        }
    }
    else {
        for (i=0;i<l1;i++) {
            sol+=d[t][i][l1-i-1]+d[t][i][l1-i];
            if (sol>=mod)
                sol-=mod;
        }
    }
    fout<<sol;
    return 0;
}