Pagini recente » Cod sursa (job #2174142) | Cod sursa (job #1814541) | Cod sursa (job #2414094) | Cod sursa (job #983247) | Cod sursa (job #3185061)
#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;
n = s1.size();
m = s2.size();
dp.resize(2, vector <vector <int> > (n + 1, vector <int> (n + 1)));
int palSize = n + m, ind1 = 1, ind2 = 0;
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]);
for(int i = 2; i <= palSize; i ++)
{
int endSt = min(n, palSize);
for(int st = 0; st <= endSt; st ++)
{
int endDr = min(n - st, palSize);
for(int dr = 0; dr <= endDr; dr ++)
{
// indicele curent dr : s2 => m - i + dr
dp[ind2][st][dr] = 0;
if(st > 0 && m - i + dr < m && s1[st - 1] == s2[m - i + dr]) // st : s1; dr : s2
dp[ind2][st][dr] += dp[ind1][st - 1][dr];//, cout << "a";
if(st > 0 && dr > 0 && s1[st - 1] == s1[n - dr]) // st : s1; dr : s1
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]) // st : s2; dr : s1
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]) // st : s2; dr : s2
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 + m) % 2)
{
for(int i = 0; i <= n; i ++)
{
ans += dp[ind1][i][n - i - 1];
if(ans >= mod)
ans -= mod;
ans += dp[ind1][i][n - i];
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;
}