Pagini recente » Cod sursa (job #1399129) | Cod sursa (job #2551543) | Cod sursa (job #1406487) | Cod sursa (job #1336315) | Cod sursa (job #3137938)
//Ilie Dumitru
#include<cstdio>
#include<cstring>
const int NMAX=512;
const int MOD=3210121;
char s[2][NMAX];
int dp[2][NMAX][NMAX];
int len[2];
bool isPalind(char* start, char* end)
{
while(start<end)
{
if(*start!=*end)
return 0;
++start;
--end;
}
return 1;
}
int main()
{
FILE* f=fopen("iv.in", "r"), *g=fopen("iv.out", "w");
//FILE* f=stdin, *g=stdout;
int i, j, k, l, step, nstep, ans=0;
for(i=0;i<2;++i)
{
fgets(s[i], NMAX, f);
len[i]=strlen(s[i]);
if(s[i][len[i]-1]=='\n')
s[i][--len[i]]=0;
}
dp[0][0][0]=1;
for(i=0;i<=len[0];++i)
{
step=i&1;
nstep=!step;
for(j=0;i+j<=len[0];++j)
{
for(k=0;k<=len[1];++k)
{
l=i+k-j;
if(l>-1 && k+l<=len[1] && dp[step][j][k])
{
if(i+j==len[0])
{
if(isPalind(s[1]+k, s[1]+len[1]-l-1))
ans=(ans+dp[step][j][k])%MOD;
}
else if(k+l==len[1])
{
if(isPalind(s[0]+i, s[0]+len[0]-j-1))
ans=(ans+dp[step][j][k])%MOD;
}
else
{
if(i+j!=len[0]-1 && s[0][i]==s[0][len[0]-j-1])
dp[nstep][j+1][k]=(dp[nstep][j+1][k]+dp[step][j][k])%MOD;
if(k+l!=len[1]-1 && s[1][k]==s[1][len[1]-l-1])
dp[step][j][k+1]=(dp[step][j][k+1]+dp[step][j][k])%MOD;
if(s[0][i]==s[1][len[1]-l-1])
dp[nstep][j][k]=(dp[nstep][j][k]+dp[step][j][k])%MOD;
if(s[1][k]==s[0][len[0]-j-1])
dp[step][j+1][k+1]=(dp[step][j+1][k+1]+dp[step][j][k])%MOD;
if(len[0]-i-j+len[1]-k-l<2)
ans=(ans+dp[step][j][k])%MOD;
}
dp[step][j][k]=0;
}
}
}
}
fprintf(g, "%d", ans);
fclose(f);
fclose(g);
return 0;
}