Pagini recente » Cod sursa (job #3198832) | Cod sursa (job #247909) | Cod sursa (job #1914211) | Cod sursa (job #3248423) | Cod sursa (job #789609)
Cod sursa(job #789609)
#include<stdio.h>
#include<cstring>
#define maxdim 505
#define mod 3210121
FILE*f=fopen("iv.in","r");
FILE*g=fopen("iv.out","w");
int n,m;
char A[maxdim],B[maxdim];
int D1[maxdim][maxdim],D2[maxdim][maxdim];
inline void dinamica () {
int each = (n + m)>>1;
D1[0][0] = 1;
for ( int chosen = 0 ; chosen < each ; ++chosen ){
for ( int i = 0 ; i <= chosen ; ++i ){
for ( int j = 0 ; j <= chosen && i + j <= n ; ++j ){
int sec_front = chosen-i,sec_back = chosen-j;
if ( i + j < n ){
if ( i + j < n - 1 ){
if ( A[i+1] == A[n-j] ){
D2[i+1][j+1] += D1[i][j];
if ( D2[i+1][j+1] >= mod ) D2[i+1][j+1] -= mod;
}
}
if ( sec_front + sec_back < m ){
if ( A[i+1] == B[m-sec_back] ){
D2[i+1][j] += D1[i][j];
if ( D2[i+1][j] >= mod ) D2[i+1][j] -= mod;
}
}
}
if ( sec_front + sec_back < m ){
if ( sec_front + sec_back < m - 1 ){
if ( B[sec_front+1] == B[m-sec_back] ){
D2[i][j] += D1[i][j];
if ( D2[i][j] >= mod ) D2[i][j] -= mod;
}
}
if ( i + j < n ){
if ( B[sec_front+1] == A[n-j] ){
D2[i][j+1] += D1[i][j];
if ( D2[i][j+1] >= mod ) D2[i][j+1] -= mod;
}
}
}
}
}
for ( int i = 0 ; i <= chosen+1 ; ++i ){
for ( int j = 0 ; j <= chosen+1 && i + j <= n ; ++j ){
D1[i][j] = D2[i][j];
D2[i][j] = 0;
}
}
}
int sol = 0;
for ( int i = 0 ; i <= each ; ++i ){
for ( int j = 0 ; j <= each && i + j <= n ; ++j ){
sol += D1[i][j];
if ( sol >= mod ) sol -= mod;
}
}
fprintf(g,"%d\n",sol);
}
int main () {
fscanf(f,"%s%s",A+1,B+1);
n = strlen(A+1); m = strlen(B+1);
dinamica();
fclose(f);
fclose(g);
return 0;
}