Cod sursa(job #3257600)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 18 noiembrie 2024 16:38:55
Problema Iv Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
//#include <bits/stdc++.h>
#define in fin
#define out fout
#define mod 3210121
#define ll long long 

using namespace std;

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

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    string a, b; in >> a >> b;
    a = "#" + a + "#";
    b = "#" + b + "#";

    int n = a.size();
    int m = b.size();

    int nr_op = (n - 2 + m - 2) / 2;

    ll dp[nr_op + 1][n][n];
    for(int p = 0; p <= nr_op; p++){
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++) dp[p][i][j] = 0;
        }
    }

    dp[0][0][n - 1] = 1;
    for(int p = 0; p < nr_op; p++){
        for(int i = 0; i <= n - 1; i++){
            for(int j = n - 1; j >= i; j--){

                // cout << "i = " << i << " j = " << j << " dp = " << dp[p][i][j] << '\n';
                
                int i2 = p - i;
                int j2 = m - (p - (n - j - 1)) - 1;
                // cout << "i2 = " << i2 << " j2 = " << j2 << '\n';
                // cout << "  -- > a =  (i) " << a[i] << "  (j) = " << a[j] << '\n';
                // cout << "  -- > a = (i2) " << b[i2] << " (j2) = " << b[j2] << '\n';

                if(a[i] == a[j]) dp[p + 1][i + 1][j - 1] = (dp[p + 1][i + 1][j - 1] + dp[p][i][j]) % mod;
                if(a[i] == b[j2]) dp[p + 1][i + 1][j] = (dp[p + 1][i + 1][j] + dp[p][i][j]) % mod;
                if(b[i2] == a[j]) dp[p + 1][i][j - 1] = (dp[p + 1][i][j - 1] + dp[p][i][j]) % mod;
                if(b[i2] == b[j2]) dp[p + 1][i][j] = (dp[p + 1][i][j] + dp[p][i][j]) % mod;

                // cout << "dp[1][1][2] = " << dp[1][1][2] << '\n';
            }
        }
    }

    // for(int i = 0; i < n; i++){
    //     for(int j = 0; j < n; j++) cout << dp[2][i][j] << " ";
    //     cout << '\n';
    // }

    ll s = 0;
    for(int i = 0; i < n; i++) s += dp[nr_op][i][n - i - 1];
    out << s << '\n';

    return 0;
}