Pagini recente » Cod sursa (job #1546969) | Cod sursa (job #2271919) | Cod sursa (job #1871915) | Cod sursa (job #1899113) | Cod sursa (job #1679758)
/*
st1 + st2 = (N + 1) - dr1 + (M + 1) - dr2
dr2 = (N + 1) + (M + 1) - dr1 - st1 - st2
*/
#include <bits/stdc++.h>
const int DIM = 1 << 9;
const int MOD = 3210121;
using namespace std;
int D[2][DIM][DIM], N, M, answer; char A[DIM], B[DIM];
int f( int val ) {
return ( val >= MOD ) ? ( val - MOD ) : val;
}
int main() {
FILE *input_file = fopen( "iv.in" , "r" );
FILE *output_file = fopen( "iv.out", "w" );
fscanf( input_file, "%s %s", A + 1, B + 1 );
N = strlen( A + 1 ); M = strlen( B + 1 );
D[0][0][N + 1] = 1;
for( int st1 = 0 + 0; st1 <= N; st1 ++ ) {
for( int st2 = 0 + 0; st2 <= M ; st2 ++ ) {
for( int dr1 = N + 1; dr1 > st1; dr1 -- ) {
int dr2 = (N + 1) + (M + 1) - dr1 - st1 - st2;
if( st1 + 1 < dr1 - 1 && A[st1 + 1] == A[dr1 - 1] )
D[(st1 + 1) & 1][st2][dr1 - 1] = f( D[(st1 + 1) & 1][st2][dr1 - 1] + D[st1 & 1][st2][dr1] );
if( st1 + 1 < dr1 && st2 < dr2 - 1 && A[st1 + 1] == B[dr2 - 1] )
D[(st1 + 1) & 1][st2][dr1 - 0] = f( D[(st1 + 1) & 1][st2][dr1 - 0] + D[st1 & 1][st2][dr1] );
if( st2 + 1 < dr2 && st1 < dr1 - 1 && B[st2 + 1] == A[dr1 - 1] )
D[st1 & 1][st2 + 1][dr1 - 1] = f( D[st1 & 1][st2 + 1][dr1 - 1] + D[st1 & 1][st2][dr1] );
if( st2 + 1 < dr2 - 1 && B[st2 + 1] == B[dr2 - 1] )
D[st1 & 1][st2 + 1][dr1 - 0] = f( D[st1 & 1][st2 + 1][dr1 - 0] + D[st1 & 1][st2][dr1] );
if( dr1 - st1 == 1 && dr2 - st2 == 1 )
answer = f( answer + D[st1 & 1][st2][dr1] );
}}
memset( D[st1 & 1], 0, sizeof(D[st1 & 1]) );
}
fprintf( output_file, "%d\n", answer );
return 0;
}