Pagini recente » Cod sursa (job #41413) | Cod sursa (job #2493954) | Cod sursa (job #42830) | Cod sursa (job #1127171) | Cod sursa (job #1902100)
#include <cstdio>
#include <cstring>
using namespace std;
const int nmx = 502;
const int mod = 3210121;
char s1[nmx],s2[nmx];
int dp[2][nmx][nmx];
int rez;
int main()
{
freopen("iv.in", "r", stdin);
freopen("iv.out", "w", stdout);
scanf("%s", s1+1);
scanf("%s", s2+1);
int l1 = strlen(s1+1), l2 = strlen(s2+1);
bool pos = 1;
dp[0][0][l1+1] = 1;
for(int st1 = 0; st1 <= l1 + 1; ++st1)
{
pos ^= 1;
for(int st2 = 0; st2 <= l2; ++st2)
for(int dr1 = l1 + 1; dr1 >= st1; --dr1)
{
int dr2 = l1 + l2 + 2 - st1 - st2 - dr1;
if(st1 + 1 < dr1 - 1 && s1[st1+1] == s1[dr1-1])
dp[pos^1][st2][dr1-1] = (dp[pos^1][st2][dr1-1] + dp[pos][st2][dr1]) % mod;
if(st1 + 1 < dr1 && st2 < dr2 - 1 && s1[st1+1] == s2[dr2-1])
dp[pos^1][st2][dr1] = (dp[pos^1][st2][dr1] + dp[pos][st2][dr1]) % mod;
if(st1 < dr1 - 1 && st2 + 1 < dr2 && s1[dr1-1] == s2[st2+1])
dp[pos][st2+1][dr1-1] = (dp[pos][st2+1][dr1-1] + dp[pos][st2][dr1]) % mod;
if(st2 + 1 < dr2 - 1 && s2[st2+1] == s2[dr2-1])
dp[pos][st2+1][dr1] = (dp[pos][st2+1][dr1] + dp[pos][st2][dr1]) % mod;
int df1 = dr1 - st1, df2 = dr2 - st2;
if((df1 == 1 && df2 == 1) || (df1 == 2 && df2 == 1) || (df1 == 1 && df2 == 2))
rez = (rez + dp[pos][st2][dr1]) % mod;
}
memset(dp[pos], 0, sizeof(dp[pos]));
}
printf("%d\n", rez);
return 0;
}