Pagini recente » Cod sursa (job #2092488) | Cod sursa (job #384363) | Cod sursa (job #19273) | Cod sursa (job #1151112) | Cod sursa (job #1050766)
#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,ans=0;
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 >= 1; --k)
{
for (int i=0; i<k; ++i)
{
for (int j=0; j<=nb; ++j)
{
int s1 = i;
int s2 = j;
int l1 = k;
int l2 = nb+1 - (s1+s2-(na+1-l1));
if (l2 > nb+1) continue;
if (k != na+1 || s1!=0 || s2!=0)
dp[ok][s1][s2] = 0;
if (s1 > 0 && l1 != na+1 && a[s1] == a[l1])
{
dp[ok][s1][s2] += dp[1-ok][s1-1][s2];
}
if (s1 > 0 && l2 !=nb+1 && 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 && l1 !=na+1 && 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 && l2 !=nb+1 && b[s2] == b[l2])
{
dp[ok][s1][s2] += dp[ok][s1][s2-1];
if (dp[ok][s1][s2] >= mod) dp[ok][s1][s2] -= mod;
}
if (s1 == l1-1 && s2 == l2-1 || s1==l1-2 && s2==l2-1 || s1==l1-1 && s2==l2-2) ans += dp[ok][s1][s2];
if (ans >= mod) ans -= mod;
}
}
ok = 1 - ok;
}
fout<<ans;
}