Pagini recente » Cod sursa (job #1202186) | Cod sursa (job #2836544) | Profil carjamihail | Cod sursa (job #465909) | Cod sursa (job #1489556)
/**
* Code by Patrick Sava
* "Spiru Haret" National College of Bucharest
**/
# include "fstream"
# include "cstring"
# include "vector"
# include "queue"
# include "bitset"
# include "algorithm"
# include "map"
# include "set"
# include "unordered_map"
# include "deque"
# include "string"
# include "iomanip"
# include "cmath"
# include "stack"
# include "cassert"
const char IN [ ] = "iv.in" ;
const char OUT [ ] = "iv.out" ;
const int MAX = 514 ;
const int MOD = 3210121 ;
# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )
using namespace std ;
ifstream cin ( IN ) ;
ofstream cout ( OUT ) ;
inline void add ( int &a , int b )
{
a += b ;
if ( a >= MOD ) a -= MOD ;
if ( a >= MOD ) a -= MOD ;
}
int dp [ 2 ] [ MAX ] [ MAX ] ;
char A [ MAX ] ;
char B [ MAX ] ;
int main ( void )
{
cin >> ( A + 1 ) ;
cin >> ( B + 1 ) ;
int n = strlen ( A + 1 ) ;
int m = strlen ( B + 1 ) ;
dp [ 0 ] [ 0 ] [ n + 1 ] = 1 ;
int p = 0 ;
int CET = 0 ;
for ( int i = 0 ; i <= n + 1 ; ++ i , p ^= 1 )
{
for ( int j = 0 ; j <= m ; ++ j )
{
for ( int ii = n + 1 ; ii >= i and ii > 0 ; -- ii )
{
int jj = n + m + 2 - ii - i - j ;
if ( jj > m + 1 ) continue ;
if ( jj < 0 ) continue ;
if ( jj < j ) continue ;
if ( i + 1 < ii - 1 and A [ i + 1 ] == A [ ii - 1 ] ) add ( dp [ p ^ 1 ] [ j ] [ ii - 1 ] , dp [ p ] [ j ] [ ii ] ) ;
if ( j + 1 < jj - 1 and B [ j + 1 ] == B [ jj - 1 ] ) add ( dp [ p ] [ j + 1 ] [ ii ] , dp [ p ] [ j ] [ ii ] ) ;
if ( i + 1 < ii and jj - 1 > j and A [ i + 1 ] == B [ jj - 1 ] )
add ( dp [ p ^ 1 ] [ j ] [ ii ] , dp [ p ] [ j ] [ ii ] ) ;
if ( j + 1 < jj and ii - 1 > i and B [ j + 1 ] == A [ ii - 1 ] )
add ( dp [ p ] [ j + 1 ] [ ii - 1 ] , dp [ p ] [ j ] [ ii ] ) ;
if ( ( i + 1 == ii and j + 1 == jj ) or ( i + 1 == ii - 1 and j + 1 == jj ) or ( i + 1 == ii and j + 1 == jj - 1 ) )
add ( CET , dp [ p ] [ j ] [ ii ] ) ;
}
}
memset ( dp [ p ] , 0 , sizeof ( dp [ p ] ) ) ;
}
cout << CET << '\n' ;
return 0;
}