Pagini recente » Cod sursa (job #628163) | Cod sursa (job #398241) | Cod sursa (job #1520660) | Cod sursa (job #587758) | Cod sursa (job #1728775)
#include<fstream>
#include<string>
#include<cstring>
using namespace std;
ifstream fin( "iv.in" ); ofstream fout( "iv.out" );
const int nmax = 500;
const int mod = 3210121;
string a, b;
int d[ 2 ][ nmax + 1 ][ nmax + 1 ];
int main() {
int n, m;
fin >> a >> b;
n = ( int )a.size(); m = ( int )b.size();
a = '#' + a; b = '#' + b;
d[ 0 ][ 0 ][ 0 ] = 1;
int ind = 0, ans = 0;
bool par = ((n + m) % 2 == 0);
for( int i = 0; i <= n; ++ i, ind = 1 - ind ) {
if ( i != 0 ) {
memset( d[ ind ], 0, sizeof( d[ ind ] ) );
}
for( int j = 0; j <= m; ++ j ) {
for( int k = 0; k <= n - i && k <= i + j; ++ k ) {
if ( i == 0 && j == 0 && k == 0 ) {
continue;
}
int x = i + j - k;
if ( x > m - j ) {
continue;
}
if ( i - 1 >= 0 && k - 1 >= 0 && a[ i ] == a[ n - k + 1 ] ) {
d[ ind ][ j ][ k ] = (d[ ind ][ j ][ k ] + d[ 1 - ind ][ j ][ k - 1 ] ) % mod;
}
if ( i - 1 >= 0 && x - 1 >= 0 && a[ i ] == b[ m - x + 1 ] ) {
d[ ind ][ j ][ k ] = (d[ ind ][ j ][ k ] + d[ 1 - ind ][ j ][ k ] ) % mod;
}
if ( j - 1 >= 0 && k - 1 >= 0 && b[ j ] == a[ n - k + 1 ] ) {
d[ ind ][ j ][ k ] = (d[ ind ][ j ][ k ] + d[ ind ][ j - 1 ][ k - 1 ] ) % mod;
}
if ( j - 1 >= 0 && x - 1 >= 0 && b[ j ] == b[ m - x + 1 ] ) {
d[ ind ][ j ][ k ] = (d[ ind ][ j ][ k ] + d[ ind ][ j - 1 ][ k ] ) % mod;
}
}
if ( par ) {
ans = ( ans + d[ ind ][ j ][ n - i ] ) % mod;
} else {
if ( i - 1 >= 0 ) ans = ( ans + d[ 1 - ind ][ j ][ n - i ] ) % mod;
if ( j - 1 >= 0 ) ans = ( ans + d[ ind ][ j - 1 ][ n - i ] ) % mod;
}
}
}
fout << ans << "\n";
fin.close();
fout.close();
return 0;
}