Pagini recente » Cod sursa (job #940953) | Cod sursa (job #521167) | Cod sursa (job #1150303) | Cod sursa (job #2594004) | Cod sursa (job #842119)
Cod sursa(job #842119)
#include <fstream>
#include <cstring>
using namespace std;
const char InFile[]="iv.in";
const char OutFile[]="iv.out";
const int MaxN=512;
const int MOD=3210121;
ifstream fin(InFile);
ofstream fout(OutFile);
int N,M,D1[MaxN][MaxN],D2[MaxN][MaxN];
char str1[MaxN],str2[MaxN];
inline void MODf(int &x)
{
if(x>=MOD)
{
x-=MOD;
}
}
int main()
{
fin>>str1+1>>str2+1;
fin.close();
N=strlen(str1+1);
M=strlen(str2+1);
D1[0][0]=1;
int side=(N+M)>>1;
for(register int i=0;i<side;++i)
{
for(register int st1=0;st1<=i;++st1)
{
for(register int dr1=0;dr1<=i && st1+dr1<=N;++dr1)
{
int st2=i-st1;
int dr2=i-dr1;
if(st1+dr1<N)
{
if(st1+dr1<N-1)
{
if(str1[st1+1]==str1[N-dr1])
{
D2[st1+1][dr1+1]+=D1[st1][dr1];
MODf(D2[st1+1][dr1+1]);
}
}
if(st2+dr2<M)
{
if(str1[st1+1]==str2[M-dr2])
{
D2[st1+1][dr1]+=D1[st1][dr1];
MODf(D2[st1+1][dr1]);
}
}
}
if(st2+dr2<M)
{
if(st2+dr2<M-1)
{
if(str2[st2+1]==str2[M-dr2])
{
D2[st1][dr1]+=D1[st1][dr1];
MODf(D2[st1][dr1]);
}
}
if(st1+dr1<N)
{
if(str2[st2+1]==str1[N-dr1])
{
D2[st1][dr1+1]+=D1[st1][dr1];
MODf(D2[st1][dr1+1]);
}
}
}
}
}
for(register int st1=0;st1<=i+1;++st1)
{
for(register int dr1=0;dr1<=i+1 && st1+dr1<=N;++dr1)
{
D1[st1][dr1]=D2[st1][dr1];
D2[st1][dr1]=0;
}
}
}
int sol=0;
for(register int st1=0;st1<=side;++st1)
{
for(register int dr1=0;dr1<=side && st1+dr1<=N;++dr1)
{
sol+=D1[st1][dr1];
MODf(sol);
}
}
fout<<sol;
fout.close();
return 0;
}