Cod sursa(job #3257883)

Utilizator iulia_morariuIuli Morariu iulia_morariu Data 19 noiembrie 2024 19:23:23
Problema Iv Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 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 = ( a.size() + b.size() ) / 2;
    ll dp[nr_op + 1][n + 1][n + 1];
    for(int i = 0; i <= nr_op; i++){
        for(int j = 0; j <= n; j++){
            for(int k = 0; k <= n; k++) dp[i][j][k] = 0;
        }
    }

    ll sol = 0;
    // if(a[0] == a[n]) dp[0][1][1] = 1;
    // if(a[0] == b[m]) dp[0][1][0] = 1;
    // if(b[0] == a[n]) dp[0][0][1] = 1;
    // if(b[0] == b[m]) dp[0][0][0] = 1;
    dp[0][0][0] = 1;

    for(int p = 1; p <= nr_op; p++){
        // cout << "P = " << p << '\n';
        for(int i = 0; i <= n && i <= p; i++){
            if(p - i > b.size()) continue;
            for(int j = 0; j + i <= n && j <= p; j++){
                if(p - j > b.size()) continue;

                int i2 = p - i, j2 = p - j;
                int pi = i - 1, pj = a.size() - j;
                int pi2 = i2 - 1, pj2 = b.size() - j2;

                if(pi >= 0 && pj < a.size() && a[pi] == a[pj]) dp[p][i][j] += dp[p - 1][i - 1][j - 1];
                if(pi >= 0 && pj2 < b.size() && a[pi] == b[pj2]) dp[p][i][j] += dp[p - 1][i - 1][j];
                if(pi2 >= 0 && pj < a.size() && b[pi2] == a[pj]) dp[p][i][j] += dp[p - 1][i][j - 1];
                if(pi2 >= 0 && pj2 < b.size() && b[pi2] == b[pj2]) dp[p][i][j] += dp[p - 1][i][j];

                dp[p][i][j] %= mod;

                // cout << "  -- > i = " << i << " j = " << j << " dp = " << dp[p][i][j] << '\n';
            }
        }
    }

    for(int i = 0; i <= n && i <= nr_op; i++){
        for(int j = 0; j + i <= n && j <= nr_op; j++){
            if(nr_op - i > b.size() || nr_op - j > b.size()) continue;
            if(2 * nr_op - i - j > b.size()) continue;
            sol += dp[nr_op][i][j];
            sol %= mod;
        }
    }
    out << sol << '\n';

    return 0;
}