Pagini recente » Cod sursa (job #2290326) | Cod sursa (job #2031971) | Cod sursa (job #470137) | Cod sursa (job #1966081) | Cod sursa (job #2377470)
#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, 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);
for (int i = 1; i <= n; ++i) {
rev_sa[i] = sa[n - i + 1];
rev_sb[i] = sb[n - i + 1]; }
for (auto i: {0, 1})
dp[i] = vector<vector<int>>(n + 1, vector<int>(n + 1));
dp[1][0][0] = 1;
for (int a = 0; a <= n; ++a) {
for (int b = 0; b <= n; ++b) if (a > 0 || b > 0) {
for (int ra = 0; ra <= n && a + ra <= n; ++ra) {
int rb = a + b - ra;
if (b + rb > n || 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]);
} }
for (int i = 0; i <= n; ++i)
ant = add(ant, dp[1][n - a][i]);
swap(dp[0], dp[1]);
for (auto &v: dp[1])
fill(begin(v), end(v), 0); }
fo << ant << endl;
return 0; }