Cod sursa(job #2273333)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 31 octombrie 2018 13:45:32
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <cstring>
#define MOD 3210121

using namespace std;

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

int n,m,p1,p2,q1,q2,d[2][510][510],sol;
char a[510],b[510];

int main()
{
    fin >> a+1;
    fin >> b+1;
    n = strlen(a+1);
    m = strlen(b+1);
    d[0][0][n+1] = 1;
    int lin = 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[lin][p2][q1-1] = (d[lin][p2][q1-1]+d[1-lin][p2][q1])%MOD;
                if (p1 < q1-1 && p2 < q2-1 && a[p1+1] == b[q2-1])
                    d[lin][p2][q1] = (d[lin][p2][q1]+d[1-lin][p2][q1])%MOD;
                if (p2 < q2-1 && p1 < q1-1 && b[p2+1] == a[q1-1])
                    d[1-lin][p2+1][q1-1] = (d[1-lin][p2+1][q1-1]+d[1-lin][p2][q1])%MOD;
                if (p2+1 < q2-1 && b[p2+1] == b[q2-1])
                    d[1-lin][p2+1][q1] = (d[1-lin][p2+1][q1]+d[1-lin][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-lin][p2][q1])%MOD;
            }
        for (int ind1=0; ind1<=505; ind1++)
            for (int ind2=0; ind2<=505; ind2++)
                d[1-lin][ind1][ind2] = 0;
        lin = 1-lin;
    }
    fout << sol;
    return 0;
}