Pagini recente » Cod sursa (job #523423) | Cod sursa (job #2887096) | Cod sursa (job #2490113) | Cod sursa (job #526106) | Cod sursa (job #3258050)
#include <fstream>
using namespace std;
const int NMAX = 500;
const int MOD = 3210121;
using ll = long long;
ifstream cin("iv.in");
ofstream cout("iv.out");
ll dp[4][NMAX + 2][NMAX + 2];
///dp[i1][j1][i2] - nr de sol pt un pal cu pref fm din i1 din a si j1 din b
///si ca suf i2 din a si i1 + j1 - i2 din b
int main()
{
string a, b;
cin >> a >> b;
dp[0][0][0] = 1; ///init
int mij = (a.size() + b.size()) / 2;
ll ans = 0;
for(int i1 = 0; i1 <= min((int)a.size(), mij); i1++) { ///CATE luam, NU pos
for(int j1 = 0; j1 + i1 <= mij && j1 <= b.size(); j1++) { ///luam ca pe cub
if(i1 == 0 && j1 == 0)
continue;
for(int i2 = 0; i2 <= a.size() - i1; i2++) {
int j2 = i1 + j1 - i2;
if(j2 + j1 > b.size() || j2 < 0)
continue;
//dp[1][j1][i2] = 0; ///RESET
int posi1 = i1 - 1, posj1 = j1 - 1; ///ok pt >0
int posi2 = a.size() - i2, posj2 = b.size() - j2; ///ok pt >0
if(i1 && i2 && a[posi1] == a[posi2])
dp[1][j1][i2] += dp[0][j1][i2 - 1];
if(i1 && j2 && a[posi1] == b[posj2])
dp[1][j1][i2] += dp[0][j1][i2];
if(j1 && i2 && b[posj1] == a[posi2])
dp[1][j1][i2] += dp[1][j1 - 1][i2 - 1];
if(j1 && j2 && b[posj1] == b[posj2])
dp[1][j1][i2] += dp[1][j1 - 1][i2];
dp[1][j1][i2] %= MOD;
if(i1 + j1 == mij) ///adica e full
ans = (ans + dp[1][j1][i2]) % MOD;
//cout << i1 << " " << j1 << " " << i2 << " " << dp[i1][j1][i2] << '\n';
}
}
///RESET (actually, transfer)
for(int j1 = 0; j1 <= 500; j1++) {
for(int i2 = 0; i2 <= 500; i2++) {
dp[0][j1][i2] = dp[1][j1][i2];
dp[1][j1][i2] = 0;
}
}
}
//cout << "traim";
cout << ans;
return 0;
}