Cod sursa(job #2483604)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 29 octombrie 2019 22:31:25
Problema Iv Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <cstring>
#define mod 3210121
using namespace std;

ifstream fin("iv.in");
ofstream fout("iv.out");

int n,N,m,i,j,l,d[510][510][510],sol;
char a[510],b[510];

int main(){
    fin>>a+1;
    n=strlen(a+1);
    fin>>b+1;
    m=strlen(b+1);

    if(a[1]==a[n])
        d[1][1][1]=1;
    if(a[1]==b[m])
        d[1][1][0]=1;
    if(b[1]==a[n])
        d[1][0][1]=1;
    if(b[1]==b[m])
        d[1][0][0]=1;

    for(l=2;l<=(n+m)/2;l++){
        for(i=0;i<=n && i<=l;i++){
            for(j=0;i+j<=n && j<=l;j++){
                ///2 din a
                if(a[i]==a[n-j+1] && i>0 && n-j+1<=n){
                    d[l][i][j]+=d[l-1][i-1][j-1];
                    d[l][i][j]%=mod;
                }

                ///1 din a, 1 din b
                if(a[i]==b[n-l+j+1] && i>0 && m-l+j+1<=m){
                    d[l][i][j]+=d[l-1][i-1][j];
                    d[l][i][j]%=mod;
                }

                ///1 din b, 1 din a
                if(b[l-i]==a[n-j+1] && l-i>0 && n-j+1<=n){
                    d[l][i][j]+=d[l-1][i][j-1];
                    d[l][i][j]%=mod;
                }

                ///2 din b
                if(b[l-i]==b[n-l+j+1] && l-i>0 && m-l+j+1<=m){
                    d[l][i][j]+=d[l-1][i][j];
                    d[l][i][j]%=mod;
                }
            }
        }
    }

    if(sol%2)
        for(i=0;i<n;i++){
            sol+=d[(n+m)/2][i][n-i]+d[(n+m)/2][i][n-i-1];
            sol%=mod;
        }
    else
        for(i=0;i<=n;i++){
            sol+=d[(n+m)/2][i][n-i];
            if(sol>mod)
                sol-=mod;
        }
    fout<<sol;

    return 0;
}