Pagini recente » Cod sursa (job #741608) | Cod sursa (job #2240408) | Cod sursa (job #2968419) | Cod sursa (job #2306495) | Cod sursa (job #3257750)
#include <iostream>
using namespace std;
const int NMAX = 500;
const int MOD = 3210121;
using ll = long long;
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;
for(int sizee = 1; sizee <= mij; sizee++) {
for(int i1 = 0; i1 <= min((int)a.size(), sizee); i1++) { ///CATE, nu poz
int j1 = sizee - i1;
if(j1 > b.size()) ///tot o sa scada
continue;
int posi1 = i1 + 1, posj1 = j1 + 1;
for(int i2 = 0; i2 <= min((int)a.size() - i1, sizee); i2++) {
int j2 = sizee - i2;
int posi2 = a.size() - i2, posj2 = b.size() - j2;
if(j2 > b.size() ||
posj2 <= posj1 || posi2 <= posi1)
continue;
if(i1 != 0 && i2 != 0 && a[posi1] == a[posi2])
dp[1][j1][i2] += dp[0][j1][i2 - 1];
if(i1 != 0 && j2 != 0 && a[posi1] == b[posj2])
dp[1][j1][i2] += dp[0][j1][i2];
if(j1 != 0 && i2 != 0 && b[posj1] == a[posi2])
dp[1][j1][i2] += dp[1][j1 - 1][i2 - 1];
if(j1 != 0 && j2 != 0 && b[posj1] == b[posj2])
dp[1][j2][i2] += dp[1][j1 - 1][i2];
dp[1][j2][i2] %= MOD;
}
}
///pasam de la 1 la 0
for(int i1 = 0; i1 <= min((int)a.size(), sizee); i1++) {
int j1 = sizee - i1;
if(j1 > b.size())
continue;
for(int i2 = 0; i2 <= min((int)a.size() - i1, sizee); i2++) {
int j2 = sizee - i2;
if(j2 > b.size())
continue;
dp[0][j1][i2] = dp[1][j1][i2];
dp[1][j1][i2] = 0;
}
}
}
for(int )
return 0;
}