Pagini recente » Cod sursa (job #1285362) | Cod sursa (job #2211324) | Cod sursa (job #2424925) | Cod sursa (job #953944) | Cod sursa (job #3257769)
#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;
}