Cod sursa(job #2486895)

Utilizator mihnea.anghelMihnea Anghel mihnea.anghel Data 3 noiembrie 2019 17:26:20
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <cstring>
#define f in
#define g out
#define mod 3210121

using namespace std;
ifstream in ( "iv.in" );
ofstream out( "iv.out" );

char a[510], b[510];
int d[2][510][510];
int n, m, l, i, j, t, sol;

int main()
{
    f>>(a+1)>>(b+1);
    n = strlen(a+1); m = strlen(b+1);

    if ( a[1] == a[n] ) d[1][1][1] = 1;
    if ( a[1] == b[m] ) d[1][1][0] = 1;
    if ( b[1] == a[n] )  d[1][0][1] = 1;
    if ( b[1] == b[m] ) d[1][0][0] = 1;
    for ( l=2; l <= (n+m)/2; l++){
        for ( i=0; i <= n && i <= l; i++ )
            for ( j=0; i+j <= n && j <= l; j++ ){
                d[t][i][j] = 0;
                
                if ( a[i] == a[n-j+1] && i && n-j+1 <= n  )
                    d[t][i][j] += d[1-t][i-1][j-1], d[t][i][j]  %= mod;
                
                if ( a[i] == b[m-l+j+1] && i && m-l+j+1 <= m )
                    d[t][i][j] += d[1-t][i-1][j], d[t][i][j]  %= mod;
                
                if ( b[l-i] == a[n-j+1] && l-i && n-j+1 <= n )
                    d[t][i][j] +=  d[1-t][i][j-1], d[t][i][j]  %= mod;
                
                if ( b[l-i] == b[m-l+j+1] && l-i && m-l+j+1 <= m )
                    d[t][i][j] += d[1-t][i][j], d[t][i][j]  %= mod;
    
            }
        t = 1-t;
    }
    t=1-t;
    if ( (n+m) % 2 )
        for ( i=0; i < n; i++ ){
            sol += d[t][i][n-i];
            sol%=mod;
            sol += d[t][i][n-i-1];
            sol %= mod;
        }
    else
        for ( i=0; i <= n; i++  ){
            sol += d[t][i][n-i];
            sol %= mod;
        }
    g<<sol;
    return 0;
}