Cod sursa(job #1489556)

Utilizator xtreme77Patrick Sava xtreme77 Data 21 septembrie 2015 16:34:25
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
/**
 * 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;
}