Cod sursa(job #2254019)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 4 octombrie 2018 18:22:02
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <cstring>
#define DIM 502
#define MOD 3210121
using namespace std;

ifstream fin ("iv.in");
ofstream fout ("iv.out");
int n,m,p1,p2,q1,q2,t,sol,i;
char a[DIM],b[DIM];
int d[2][DIM][DIM];
int main (){

    fin>>a+1>>b+1;
    n = strlen (a+1);
    m = strlen (b+1);

    /// q2 = p1 + p2 + q1 - n - m - 2
    t = 1;
    d[0][0][n+1] = 1;
    for (p1=0;p1<=n;p1++){
        for (p2=0;p2<=m;p2++)
            for (q1=n+1;q1>=p1;q1--){
                q2 = n + m + 2 - p1 - p2 - q1;
                if (p1+1 < q1-1 && a[p1+1] == a[q1-1]){
                    d[t][p2][q1-1] = (d[t][p2][q1-1] + d[1-t][p2][q1]) % MOD;
                }

                if (p1 < q1-1 && p2+1 < q2 && a[q1-1] == b[p2+1]){
                    d[1-t][p2+1][q1-1] = (d[1-t][p2+1][q1-1] + d[1-t][p2][q1] ) % MOD;
                }

                if (p1+1 < q1 && p2 < q2-1 && a[p1+1] == b[q2-1]){
                    d[t][p2][q1] = (d[t][p2][q1] + d[1-t][p2][q1]) %MOD;
                }

                if (p2+1 < q2-1 && b[p2+1] == b[q2-1]){
                    d[1-t][p2+1][q1] = (d[1-t][p2+1][q1] + d[1-t][p2][q1]) % MOD;
                }

                if ( (q1-p1==1 && q2-p2==1) || (q1-p1==1 && q2-p2==2) || (q1-p1==2 && q2-p2==1) )
                    sol = (sol + d[1-t][p2][q1]) % MOD;
            }
        memset (d[1-t],0,sizeof(d[1-t]));
        t = 1 - t;
    }

    /*t = 1 - t;
    if ((n+m) % 2){
        for (i=0;i<=n;i++)
            sol = (sol + d[t][i][n-i]) % MOD;
    }
    else{
        for (i=0;i<n;i++)
            sol = (sol + d[t][i][n-i] + d[t][i][n-i-1]) % MOD;
    }*/
    fout<<sol;

    return 0;
}