Cod sursa(job #3169506)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 15 noiembrie 2023 09:36:09
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>

#define DIM 500
#define MOD 3210121

#define int long long

using namespace std;

//ifstream f("in.in");
//ofstream g("out.out");

ifstream f("iv.in");
ofstream g("iv.out");

int n,m;
int dp[3][DIM+5][DIM+5];
char a[DIM+5],b[DIM+5];
int sol = 0;

signed main(){


    f.getline(a+1,DIM+5);
    f.getline(b+1,DIM+5);

    n = strlen(a+1);
    m = strlen(b+1);

    int l = 0;
    dp[l][0][0] = 1;
    for(int i = 1;i<=(n+m)/2;i++){
        l^=1;
        for(int ja = 0;ja<=n;ja++){
            for(int ka = 0;ja+ka<=n;ka++){

                int jb = i-ja;
                int kb = i-ka;

                dp[l][ja][ka] = 0;

                if(a[ja] == a[n-ka+1] && ja > 0 && ka > 0){
                    dp[l][ja][ka] += dp[l^1][ja-1][ka-1];
                    dp[l][ja][ka] %= MOD;
                }

                if(a[ja] == b[m-kb+1] && ja > 0 && kb > 0){
                    dp[l][ja][ka] += dp[l^1][ja-1][ka];
                    dp[l][ja][ka] %= MOD;
                }

                if(b[jb] == a[n-ka+1] && jb > 0 && ka > 0){
                    dp[l][ja][ka] += dp[l^1][ja][ka-1];
                    dp[l][ja][ka] %= MOD;
                }

                if(b[jb] == b[m-kb+1] && jb>0 && kb > 0){
                    dp[l][ja][ka] += dp[l^1][ja][ka];
                    dp[l][ja][ka] %= MOD;
                }
            }
        }
    }

    if((n+m)%2 == 0){
        for(int i=0;i<=n;i++){
            sol += dp[l][i][n-i];
            sol %= MOD;
        }
    }else{
        for(int i=0;i<n;i++){
            sol += dp[l][i][n-i-1];
            sol %= MOD;
            sol += dp[l][i][n-i];
            sol %= MOD;
        }
    }

    g<<sol;
    return 0;
}