Cod sursa(job #3250549)

Utilizator BurloiEmilAndreiBurloi Emil Andrei BurloiEmilAndrei Data 21 octombrie 2024 20:31:08
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
#define pb push_back

const string FILE_NAME = "iv";

const int MAX_N = 500, MOD = 3210121;

int dp[2][MAX_N + 5][MAX_N + 5];

int main () {
#ifndef LOCAL
  ifstream cin(FILE_NAME + ".in");
  ofstream cout(FILE_NAME + ".out");
#endif

  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  int len, n, m, st1, st2, dr1, dr2, ans;
  string a, b;

  cin >> a >> b;
  n = a.size();
  m = b.size();
  // index 1
  a = '#' + a;
  b = '#' + b;
  dp[0][0][0] = 1;
  for (len = 1; len <= (n + m) / 2; len++) {
    for (st1 = 0; st1 <= MAX_N; st1++) {
      for (dr1 = 0; dr1 <= MAX_N; dr1++) {
        dp[(len & 1)][st1][dr1] = 0;
      }
    }
    for (st1 = 0; st1 <= min(len, n); st1++) {
      for (dr1 = 0; dr1 <= min(len, n - st1); dr1++) {
        st2 = len - st1;
        dr2 = len - dr1;

        if (a[st1] == a[n - dr1 + 1]) {
          dp[(len & 1)][st1][dr1] =
              (dp[(len & 1)][st1][dr1] + dp[1 - (len & 1)][st1 - 1][dr1 - 1]) %
              MOD;
        }
        if (b[st2] == b[m - dr2 + 1]) {
          dp[(len & 1)][st1][dr1] =
              (dp[(len & 1)][st1][dr1] + dp[1 - (len & 1)][st1][dr1]) % MOD;
        }

        if (a[st1] == b[m - dr2 + 1]) {
          dp[(len & 1)][st1][dr1] =
              (dp[(len & 1)][st1][dr1] + dp[1 - (len & 1)][st1 - 1][dr1]) % MOD;
        }
        if (b[st2] == a[n - dr1 + 1]) {
          dp[(len & 1)][st1][dr1] =
              (dp[(len & 1)][st1][dr1] + dp[1 - (len & 1)][st1][dr1 - 1]) % MOD;
        }
      }
    }
  }

  ans = 0;
  for (st1 = 0; st1 <= n; st1++) {
    dr1 = n - st1;
    ans = (ans + dp[((n + m) / 2) & 1][st1][dr1]) % MOD;
  }

  if ((n + m) & 1) {
    for (st1 = 0; st1 <= n; st1++) {
      dr1 = n - st1 - 1;
      ans = (ans + dp[((n + m) / 2) & 1][st1][dr1]) % MOD;
    }
  }

  cout << ans << "\n";
  return 0;
}