Pagini recente » Cod sursa (job #1399891) | Cod sursa (job #251691) | Cod sursa (job #2644644) | Cod sursa (job #642566) | Cod sursa (job #2475842)
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MOD = 3210121;
int add(int a, int b)
{
a += b;
if (a >= MOD)
return a - MOD;
if (a < 0)
return a + MOD;
return a;
}
int mul(int a, int b)
{
return a * (ll) b % MOD;
}
const int N = 500 + 7;
int n, m, a[N], b[N];
string s, t;
int dp[N][N];
int ndp[N][N];
int main()
{
freopen ("iv.in", "r", stdin);
freopen ("iv.out", "w", stdout);
cin >> s >> t;
n = (int) s.size();
m = (int) t.size();
for (int i = 1; i <= n; i++)
a[i] = s[i - 1];
for (int i = 1; i <= m; i++)
b[i] = t[i - 1];
dp[0][0] = 1;
int half = (n + m) / 2, nd = max(n, m);
for (int l = 0; l < half; l++)
{
for (int x = 0; x <= nd; x++)
for (int y = 0; y <= nd; y++)
{
int a1 = x + 1, a2 = n - x;
int b1 = l - x + 1, b2 = m - (l - x);
int la = (a1 != a2), lb = (b1 != b2);
for (int fi = 0; fi <= la; fi++)
for (int sc = 0; sc <= lb; sc++)
{
int va = (fi == 0) ? a[a1] : a[a2], vb = (sc == 0) ? b[b1] : b[b2];
if (va == vb)
ndp[x + (fi == 0)][y + (sc == 0)] = add(ndp[x + (fi == 0)][y + (sc == 0)], dp[x][y]);
}
}
for (int x = 0; x <= nd; x++)
for (int y = 0; y <= nd; y++)
{
dp[x][y] = ndp[x][y];
ndp[x][y] = 0;
}
}
int ans = 0;
for (int x = 0; x <= nd; x++)
for (int y = 0; y <= nd; y++)
ans = add(ans, dp[x][y]);
cout << ans << "\n";
return 0;
}