Pagini recente » Cod sursa (job #2003530) | Cod sursa (job #2331680) | Cod sursa (job #71397) | Cod sursa (job #123092) | Cod sursa (job #1470708)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("iv.in");
ofstream g("iv.out");
int N,M;
char A[505],B[505];
const int MOD = 3210121;
int DP[2][505][505];
void Read()
{
f>>(A+1);
f>>(B+1);
N=strlen(A+1);
M=strlen(B+1);
}
inline void add(int& x,int y)
{
x+=y;
while(x>=MOD)
x-=MOD;
}
void Solve()
{
int ind=1;
DP[1][N][1]=1;
int ans=0;
for(int i=1;i<=N+1;i++)
{
for(int j=N;j>=0;j--)
{
for(int k=1;k<=M+1;k++)
{
int l=M+N+2-i-j-k;
if(l<0 || l>M)
{
DP[ind][j][k]=0;
continue;
}
if(i==j+1 && k==l+1)
add(ans,DP[ind][j][k]);
if(j<i || k>l)
{
DP[ind][j][k]=0;
continue;
}
if(A[i]==A[j] && j>0)
add(DP[1-ind][j-1][k],DP[ind][j][k]);
if(B[k]==B[l])
add(DP[ind][j][k+1],DP[ind][j][k]);
if(A[i]==B[l])
add(DP[1-ind][j][k],DP[ind][j][k]);
if(A[j]==B[k] && j>0)
add(DP[ind][j-1][k+1],DP[ind][j][k]);
DP[ind][j][k]=0;
}
}
ind=1-ind;
}
g<<ans<<"\n";
}
int main()
{
Read();
Solve();
return 0;
}