Pagini recente » Cod sursa (job #1782386) | Cod sursa (job #2110485) | Cod sursa (job #157302) | Cod sursa (job #1702100) | Cod sursa (job #3184985)
#include <bits/stdc++.h>
using namespace std;
const int mod = 3210121;
int n, m;
string s1, s2;
vector <vector <vector <int> > > dp;
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
cin >> s1 >> s2;
dp.resize(2, vector <vector <int> > (s1.size() + 1, vector <int> (s1.size() + 1)));
int palSize = s1.size() + s2.size(), ind1 = 1, ind2 = 0;
n = s1.size();
m = s2.size();
palSize >>= 1;
dp[1][0][0] = (s2[0] == s2[m - 1]);
dp[1][0][1] = (s2[0] == s1[n - 1]);
dp[1][1][0] = (s1[0] == s2[m - 1]);
dp[1][1][1] = (s1[0] == s1[n - 1]);
// cout << dp[1][0][0] << " " << dp[1][0][1] << " " << dp[1][1][0] << " " << dp[1][1][1] << "\n";
for(int i = 2; i <= palSize; i ++)
{
for(int st = 0; st <= s1.size(); st ++)
{
for(int dr = 0; dr <= s1.size(); dr ++)
{
dp[ind2][st][dr] = 0;
// indicele curent dr in sirul 2 este m - i + dr
if(st > 0 && m - i + dr < m && s1[st - 1] == s2[m - i + dr]) // adaug din pr la stanga si din al doilea la dreapta
dp[ind2][st][dr] += dp[ind1][st - 1][dr];//, cout << "a";
if(st > 0 && dr > 0 && s1[st] == s1[n - dr]) // adaug din pr la stanga si din pr la dreapta
dp[ind2][st][dr] += dp[ind1][st - 1][dr - 1];//, cout << "b";
if(dr > 0 && i - st - 1 >= 0 && s2[i - st - 1] == s1[n - dr]) // adaug din al doilea la stanga si din primul la dreapta
dp[ind2][st][dr] += dp[ind1][st][dr - 1];//, cout << "c";
if(i - st - 1 >= 0 && m - i + dr < m && s2[i - st - 1] == s2[m - i + dr]) // adaug din al doilea la stanga si din al doilea la dreapta
dp[ind2][st][dr] += dp[ind1][st][dr];//, cout << "d";
dp[ind2][st][dr] %= mod;
// cout << " " << st << " " << dr << " " << dp[ind2][st][dr]<< "\n";
}
}
swap(ind2, ind1);
}
int ans = 0;
if(n & 1) //?
{
for(int i = 0; i <= n; i ++)
{
ans += dp[ind1][i][n - i - 1];
if(ans >= mod)
ans -= mod;
}
cout << ans;
return 0;
}
for(int i = 0; i <= n; i ++)
{
ans += dp[ind1][i][n - i];
if(ans >= mod)
ans -= mod;
}
cout << ans;
return 0;
}