Pagini recente » Cod sursa (job #2764869) | Cod sursa (job #2073826) | Cod sursa (job #1648355) | Cod sursa (job #1052994) | Cod sursa (job #1050666)
#include <fstream>
#include <string.h>
#define maxn 510
#define mod 3210121
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
int dp[2][maxn][maxn],ok;
char a[maxn],b[maxn];
int main()
{
fin>>(a+1)>>(b+1);
int na = strlen(a+1);
int nb = strlen(b+1);
dp[0][0][0] = 1;
ok=0;
for (int k=na+1; k > na/2; --k)
{
for (int i=0; i<=na/2; ++i)
{
for (int j=0; j<=nb/2; ++j)
{
int s1 = i;
int s2 = j;
int l1 = k;
int l2 = nb - (s1+s2-na-2+l1);
if (l2 <= nb/2 || l2 >nb+1)
{
continue;
}
if (ok != 0 && s1!=0 && s2!=0)
dp[ok][s1][s2] = 0;
if (s1 > 0 && a[s1] == a[l1])
{
dp[ok][s1][s2] += dp[1-ok][s1-1][s2];
}
if (s1 > 0 && a[s1] == b[l2])
{
dp[ok][s1][s2] += dp[ok][s1-1][s2];
if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
}
if (s2 > 0 && b[s2] == a[l1])
{
dp[ok][s1][s2] += dp[1-ok][s1][s2-1];
if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
}
if (s2 > 0 && b[s2] == b[l2])
{
dp[ok][s1][s2] += dp[ok][s1][s2-1];
if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
}
}
}
ok = 1 - ok;
}
ok = 1 - ok;
fout<<(dp[ok][na/2][na/2]*2)%mod;
}