Pagini recente » Cod sursa (job #2689399) | Cod sursa (job #6462) | Cod sursa (job #2916794) | Cod sursa (job #49676) | Cod sursa (job #3145994)
#include <fstream>
std::ifstream cin("iv.in");
std::ofstream cout("iv.out");
const int MOD = 3210121;
int dp[2][505][505];
std::string s1, s2;
int n, m;
int rez;
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> s1 >> s2;
n = s1.size();
m = s2.size();
s1 = "$" + s1;
s2 = "$" + s2;
dp[0][0][0] = 1;
for(int i = 0; i <= n; i++)
for(int j = 0; j + i <= n; j++)
for(int x = std::max(0, j - i); x <= m; x++) {
int y = i - j + x;
if(x + y > m) {
x = m + 1;
continue;
}
int id = i & 1;
int idAnt = (i + 1) & 1;
int val = dp[i & 1][j][x];
dp[id][j][x] = 0;
if(i + j + x + y == n + m) {
rez = (rez + val) % MOD;
x = m + 1;
continue;
}
if(i + j + x + y == n + m - 1) {
rez = (rez + val) % MOD;
continue;
}
if(s1[i + 1] == s1[n - j])
dp[idAnt][j + 1][x] = (dp[idAnt][j + 1][x] + val) % MOD;
if(s1[n - j] == s2[x + 1])
dp[id][j + 1][x + 1] = (dp[id][j + 1][x + 1] + val) % MOD;
if(y < m) {
if(s2[x + 1] == s2[m - y])
dp[id][j][x + 1] = (dp[id][j][x + 1] + val) % MOD;
if(s1[i + 1] == s2[m - y])
dp[idAnt][j][x] = (dp[idAnt][j][x] + val) % MOD;
}
}
cout << rez << '\n';
return 0;
}