Pagini recente » Cod sursa (job #370002) | Cod sursa (job #1944587) | Cod sursa (job #274937) | Cod sursa (job #907020) | Cod sursa (job #3206410)
#include <fstream>
#include <cstring>
#define MAX 500
#define MOD 3210121
using namespace std;
ifstream cin ("iv.in");
ofstream cout ("iv.out");
string s1, s2;
int dp[5][MAX + 1][MAX + 10];
int main()
{
cin >> s1 >> s2;
int n1 = s1.size();
int n2 = s2.size();
if (s1[0] == s1[n1 - 1])
dp[1][1][1] = 1;
if (s1[0] == s2[n2 - 1])
dp[1][1][0] = 1;
if (s2[0] == s1[n1 - 1])
dp[1][0][1] = 1;
if (s2[0] == s2[n2 - 1])
dp[1][0][0] = 1;
int n = (n1 + n2) / 2;
for (int sz = 2; sz <= n; sz++)
for (int i = 0; i <= n1 && i <= sz; i++)
for (int j = 0; j <= n1 - i && j <= sz; j++)
{
dp[sz % 2][i][j] = 0;
if (1 <= i && 1 <= j && s1[i - 1] == s1[n1 - j]) /// din s1 la stanga si din s1 la dreapta
dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i - 1][j - 1]) % MOD;
if (1 <= i && j < sz && s1[i - 1] == s2[n2 - sz + j]) /// din s1 la stanga si din s2 la dreapta
dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i - 1][j]) % MOD;
if (i < sz && 1 <= j && s2[sz - i - 1] == s1[n1 - j]) /// din s2 la stanga si din s1 la dreapta
dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i][j - 1]) % MOD;
if (i < sz && j < sz && s2[sz - i - 1] == s2[n2 - sz + j]) /// din s2 la stanga si din s2 la dreapta
dp[sz % 2][i][j] = (dp[sz % 2][i][j] + dp[1 - sz % 2][i][j]) % MOD;
}
int ans = 0;
for (int i = 0; i <= n1; i++)
ans = (ans + dp[n % 2][i][n1 - i]);
if ((n1 + n2) % 2 == 1)
for (int i = 0; i <= n1; i++)
ans = (ans + dp[n % 2][i][n1 - i - 1]);
cout << ans;
return 0;
}