Cod sursa(job #2278984)

Utilizator DavidLDavid Lauran DavidL Data 8 noiembrie 2018 19:54:06
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("iv.in");
ofstream fo("iv.out");

const int NMAX = 505;
const int MOD = 3210121;

char A[NMAX], B[NMAX];
int n, m;
int dp[2][NMAX][NMAX];

void add(int &a, int b)
{
    a += b;
    if (a >= MOD)
        a -= MOD;
}

int main()
{
    fi >> A + 1 >> B + 1;
    n = strlen(A + 1), m = strlen(B + 1);

    dp[0][0][0] = 1;

    int r = 0;
    int rez = 0;
    for (int p1 = 0; p1 <= n; p1++)
    {
        for (int p2 = 0; p2 <= m; p2++)
        {
            for (int q1 = 0; q1 + p1 <= n; q1++)
            {
                int q2 = p1 + p2 - q1;
                if (q2 < 0)
                    continue;

                if (p1 + q1 + 2 <= n && A[p1 + 1] == A[n - q1])
                    add(dp[1 - r][p2][q1 + 1], dp[r][p2][q1]);
                if (p2 + q2 + 2 <= m && B[p2 + 1] == B[m - q2])
                    add(dp[r][p2 + 1][q1], dp[r][p2][q1]);
                if (p1 + q1 + 1 <= n && p2 + q2 + 1 <= m && A[p1 + 1] == B[m - q2])
                    add(dp[1 - r][p2][q1], dp[r][p2][q1]);
                if (p1 + q1 + 1 <= n && p2 + q2 + 1 <= m && B[p2 + 1] == A[n - q1])
                    add(dp[r][p2 + 1][q1 + 1], dp[r][p2][q1]);

                if ((p1 + q1 == n || p2 + q2 == m) && p1 + q1 + p2 + q2 >= n + m - 1)
                    add(rez, dp[r][p2][q1]);
                dp[r][p2][q1] = 0;

            }
        }
        r = 1 - r;
    }
    fo << rez;


    return 0;
}