Pagini recente » Cod sursa (job #2255647) | Cod sursa (job #2104419) | Cod sursa (job #2495225) | Cod sursa (job #2589918) | Cod sursa (job #2377482)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("iv.in");
ofstream fo("iv.out");
const int N = 505, MOD = 3210121;
char sa[N], sb[N], rev_sa[N], rev_sb[N];
vector<vector<int>> dp[2];
int n, m, ant;
static int add(int a, int b) {
int res = a + b;
if (res >= MOD)
res-= MOD;
return res; }
int main() {
fi >> (sa + 1) >> (sb + 1);
n = strlen(sa + 1);
m = strlen(sb + 1);
for (int i = 1; i <= n; ++i)
rev_sa[i] = sa[n - i + 1];
for (int i = 1; i <= m; ++i)
rev_sb[i] = sb[m - i + 1];
for (auto i: {0, 1})
dp[i] = vector<vector<int>>(m + 1, vector<int>(n + 1));
dp[1][0][0] = 1;
for (int a = 0; a <= n; ++a) {
for (int b = 0; b <= m; ++b) if (a > 0 || b > 0) {
for (int ra = 0; ra <= n && a + ra <= n; ++ra) {
int rb = a + b - ra;
if (b + rb > m || rb < 0)
continue;
if (ra > 0 && a > 0 && sa[a] == rev_sa[ra])
dp[1][b][ra] = add(dp[1][b][ra], dp[0][b][ra - 1]);
if (rb > 0 && a > 0 && sa[a] == rev_sb[rb])
dp[1][b][ra] = add(dp[1][b][ra], dp[0][b][ra]);
if (b > 0 && rb > 0 && sb[b] == rev_sb[rb])
dp[1][b][ra] = add(dp[1][b][ra], dp[1][b - 1][ra]);
if (b > 0 && ra > 0 && sb[b] == rev_sa[ra])
dp[1][b][ra] = add(dp[1][b][ra], dp[1][b - 1][ra - 1]); } }
if (0 <= (n + m) / 2 - a && (n + m) / 2 - a <= m)
for (int i = 0; i <= n; ++i)
ant = add(ant, dp[1][(n + m) / 2 - a][i]);
swap(dp[0], dp[1]);
for (auto &v: dp[1])
fill(begin(v), end(v), 0); }
fo << ant << endl;
return 0; }