Cod sursa(job #1691507)

Utilizator borcanirobertBorcani Robert borcanirobert Data 18 aprilie 2016 16:32:40
Problema Iv Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream fin("iv.in");
ofstream fout("iv.out");

const int MAX = 510;
const int MOD = 3210121;
char a[MAX], b[MAX];
int D[2][MAX][MAX];
int st1, st2, dr1, dr2;
int N, M;
bool lc, lp;
int sol;

int main()
{
    int i, j;

    fin.getline(a + 1, MAX);
    fin.getline(b + 1, MAX);
    N = strlen(a + 1);
    M = strlen(b + 1);

    D[0][0][N + 1] = 1; lc = 0, lp = 1;
    for ( st1 = 0; st1 <= N; st1++, lc = !lc, lp = !lp )
        for ( st2 = 0; st2 <= M; st2++ )
            for ( dr1 = N + 1; dr1 > st1; dr1-- )
                if ( !( st1 == 0 && st2 == 0 && dr1 == N + 1 ) )
                {
                    dr2 = M + 1 - st1 - st2  + ( N + 1 - dr1 );
                    if ( !(dr2 >= 1 && dr2 <= M + 1) ) continue;
                    D[lc][st2][dr1] = 0;
                    if ( a[st1] == a[dr1] && st1 != 0 && dr1 != N + 1 )
                        D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lp][st2][dr1 + 1] ) % MOD;
                    if ( a[st1] == b[dr2] && st1 != 0 && dr2 != M + 1 )
                        D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lp][st2][dr1] ) % MOD;
                    if ( a[st2] == b[dr1] && st2 != 0 && dr1 != N + 1 )
                        D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lc][st2 - 1][dr1 + 1] ) % MOD;
                    if ( a[st2] == b[dr2] && st2 != 0 && dr2 != M + 1 )
                        D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lc][st2 - 1][dr1] ) % MOD;
                    if ( ( dr2 - st2 == 1 && dr1 - st1 == 1 && ( N + M ) % 2 == 0 ) || ( dr2 - st2 == 2 && dr1 - st1 == 1 && ( N + M ) % 2 ) || ( dr2 - st2 == 1 && dr1 - st1 == 2 && ( N + M ) % 2 ) )
                        sol = ( sol + D[lc][st2][dr1] ) % MOD;
                }

    fout << sol;

    fin.close();
    fout.close();
    return 0;
}