Cod sursa(job #1728775)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 13 iulie 2016 17:19:24
Problema Iv Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#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;
}