Pagini recente » Cod sursa (job #1241995) | Cod sursa (job #932960) | Cod sursa (job #1091428) | Cod sursa (job #2209695) | Cod sursa (job #1733395)
#include <fstream>
#include <cstring>
using namespace std;
const int NMAX = 505;
const int MOD = 3210121;
int n, m;
char s1[NMAX], s2[NMAX];
int dp[NMAX][NMAX][NMAX];
void add(int &where, int val) {
where += val;
if (where >= MOD)
where -= MOD;
}
int main()
{
ifstream cin("iv.in");
ofstream cout("iv.out");
cin.get(s1 + 1, NMAX); cin.get();
cin.get(s2 + 1, NMAX); cin.get();
n = strlen(s1 + 1);
m = strlen(s2 + 1);
int len = n + m;
dp[0][0][0] = 1;
bool h = 0;
for (int l = 0; l < (len + 1) / 2; ++ l, h ^= 1) {
memset(dp[h ^ 1], 0, sizeof(dp[h ^ 1]));
for (int a = 0; a <= n; ++ a)
for (int b = 0; a + b <= n; ++ b) {
int a_prim = l - a;
int b_prim = l - b;
if (a_prim + b_prim <= m) { //Daca starea are sens
if ((len & 1) && l == (len + 1) / 2 - 1) { //Litera din mijloc
if (a + 1 == n - b)
add(dp[h ^ 1][a + 1][b], dp[h][a][b]);
else
add(dp[h ^ 1][a][b], dp[h][a][b]);
}
else {
//sus - sus
if (a + 1 < n - b && s1[a + 1] == s1[n - b])
add(dp[h ^ 1][a + 1][b + 1], dp[h][a][b]);
//jos - jos
if (a_prim + 1 < m - b_prim && s2[a_prim + 1] == s2[m - b_prim])
add(dp[h ^ 1][a][b], dp[h][a][b]);
if (a + 1 <= n - b && a_prim + 1 <= m - b_prim) {
//sus - jos
if (s1[a + 1] == s2[m - b_prim])
add(dp[h ^ 1][a + 1][b], dp[h][a][b]);
//jos - sus
if (s2[a_prim + 1] == s1[n - b])
add(dp[h ^ 1][a][b + 1], dp[h][a][b]);
}
}
}
}
}
int ans = 0;
for (int a = 0; a <= n; ++ a)
for (int b = 0; a + b <= n; ++ b)
add(ans, dp[h][a][b]);
cout << ans << '\n';
cin.close();
cout.close();
return 0;
}