Cod sursa(job #2485551)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 1 noiembrie 2019 18:56:20
Problema Iv Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <cstring>
#define DIM 505
#define K 3210121
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
int n,m,i,j,l,k,t,sol;
int d[2][DIM][DIM];
char a[DIM],b[DIM];
int main(){
    fin>>a+1>>b+1;
    n=strlen(a+1);
    m=strlen(b+1);
/**formez prefixe si sufixe egale la inceput si final si tot adaug cate o litera
D[l][i][j]=? moduri de a forma palindr cu pref de lg l folosind primele i litere
din a, primele l-i din b, ultimele j din a si ultimele l-j din b**/
    if(a[1]==a[n])d[1][1][1]=1;
    if(b[1]==b[m])d[1][0][0]=1;
    if(a[1]==b[m])d[1][1][0]=1;
    if(a[n]==b[1])d[1][0][1]=1;
    for(l=2,k=(m+n)/2;l<=k;l++){
        for(i=0;i<=n;i++)
            for(j=0;j<=m;j++){
                d[t][i][j]=0;
                if(a[i]==a[n-j+1] && i>0 && n-j+1<=n)
                    d[t][i][j]=(d[t][i][j]+d[1-t][i-1][j-1])%K;
                if(b[l-i]==b[m-l+j+1] && l-i>0 && m-l+j+1<=n)
                    d[t][i][j]=(d[t][i][j]+d[1-t][i][j])%K;
                if(a[i]==b[m-l+j+1] && i>0 && m-l+j+1<=m)
                    d[t][i][j]=(d[t][i][j]+d[1-t][i-1][j])%K;
                if(a[n-j+1]==b[l-i] && l-i>0 && n-j+1<=n)
                    d[t][i][j]=(d[t][i][j]+d[1-t][i][j-1])%K;
            }
        t=!t;
    }
    t=!t;
    if((n+m)%2)///elem ramas la mjl poate fi ori din a ori din b
        for(i=0;i<n;i++){
            sol=(sol+d[t][i][n-i])%K;
            sol=(sol+d[t][i][n-i-1])%K;
        }
    else
        for(i=0;i<=n;i++)
            sol=(sol+d[t][i][n-i]);
    fout<<sol;
    return 0;
}