Cod sursa(job #3257769)

Utilizator IanisBelu Ianis Ianis Data 19 noiembrie 2024 14:44:10
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#pragma GCC optimize("Ofast")
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#ifdef LOCAL
ifstream fin("input.txt");
#define fout cout
#else
ifstream fin("iv.in");
ofstream fout("iv.out");
#define endl '\n'
#endif

constexpr int NMAX = 505;
constexpr int MOD = 3210121;

int n, m;
string a, b;
int dp[2][NMAX][NMAX];

void read() {
    fin >> a >> b;
    n = a.size();
    m = b.size();
    a = "$" + a + "$";
    b = "$" + b + "$";
}

int solve() {
    int ans = 0;

    dp[0][0][0] = 1;

    for (int l1 = 0; l1 <= n; l1++) {
        if (l1 != 0) {
            for (int r1 = 0; r1 <= n; r1++) {
                fill(dp[l1 & 1][r1], dp[l1 & 1][r1] + m + 2, 0);
            }
        }
        for (int r1 = 0; l1 + r1 <= n; r1++) {
            for (int l2 = 0; l2 <= m && l1 + l2 <= (n + m) / 2; l2++) {
                const int r2 = l1 + l2 - r1;
                if (r2 < 0 || (l2 + r2) > m) continue;

                if (l1 && r1 && a[l1] == a[n - r1 + 1]) {
                    dp[l1 & 1][r1][l2] += dp[(l1 - 1) & 1][r1 - 1][l2];
                }
                if (l1 && r2 && a[l1] == b[m - r2 + 1]) {
                    dp[l1 & 1][r1][l2] += dp[(l1 - 1) & 1][r1][l2];
                }
                if (l2 && r1 && b[l2] == a[n - r1 + 1]) {
                    dp[l1 & 1][r1][l2] += dp[l1 & 1][r1 - 1][l2 - 1];
                }
                if (l2 && r2 && b[l2] == b[m - r2 + 1]) {
                    dp[l1 & 1][r1][l2] += dp[l1 & 1][r1][l2 - 1];
                }

                dp[l1 & 1][r1][l2] %= MOD;

                if (l1 + l2 == (n + m) / 2) {
                    (ans += dp[l1 & 1][r1][l2]) %= MOD;
                }
            }
        }
    }

    return ans;
}

signed main() {
    read();
    fout << solve() << endl;
    return 0;
}