Pagini recente » Cod sursa (job #2277737) | Cod sursa (job #695065) | Cod sursa (job #1261119) | Cod sursa (job #667805) | Cod sursa (job #3257917)
#include <fstream>
using namespace std;
const int NMAX = 200;
const int MOD = 3210121;
using ll = long long;
ifstream cin("iv.in");
ofstream cout("iv.out");
ll dp[NMAX + 2][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;
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;
int posi1 = i1 - 1, posj1 = j1 - 1;
int posi2 = a.size() - i2, posj2 = b.size() - j2;
if(i1 != 0 && i2 != 0 && a[posi1] == a[posi2])
dp[i1][j1][i2] += dp[i1 - 1][j1][i2 - 1];
if(i1 != 0 && j2 != 0 && a[posi1] == b[posj2])
dp[i1][j1][i2] += dp[i1 - 1][j1][i2];
if(j1 != 0 && i2 != 0 && b[posj1] == a[posi2])
dp[i1][j1][i2] += dp[i1][j1 - 1][i2 - 1];
if(j1 != 0 && j2 != 0 && b[posj1] == b[posj2])
dp[i1][j1][i2] += dp[i1][j1 - 1][i2];
dp[i1][j1][i2] %= MOD;
//cout << i1 << " " << j1 << " " << i2 << " " << dp[i1][j1][i2] << '\n';
}
}
}
//cout << "traim";
ll ans = 0;
for(int i1 = 0; i1 <= min((int)a.size(), mij); i1++) {
int j1 = mij - i1;
if(j1 > b.size()) ///o sa mai scada
continue;
int i2 = a.size() - i1;
int j2 = b.size() - j1;
ans = (ans + dp[i1][j1][i2]) % MOD;
}
cout << ans;
return 0;
}