Cod sursa(job #2475842)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 17 octombrie 2019 17:38:37
Problema Iv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <iostream>
#include <cstdio>

using namespace std;

typedef long long ll;
const int MOD = 3210121;

int add(int a, int b)
{
        a += b;
        if (a >= MOD)
                return a - MOD;
        if (a < 0)
                return a + MOD;
        return a;
}

int mul(int a, int b)
{
        return a * (ll) b % MOD;
}

const int N = 500 + 7;
int n, m, a[N], b[N];
string s, t;
int dp[N][N];
int ndp[N][N];

int main()
{
        freopen ("iv.in", "r", stdin);
        freopen ("iv.out", "w", stdout);

        cin >> s >> t;
        n = (int) s.size();
        m = (int) t.size();

        for (int i = 1; i <= n; i++)
                a[i] = s[i - 1];
        for (int i = 1; i <= m; i++)
                b[i] = t[i - 1];



        dp[0][0] = 1;
        int half = (n + m) / 2, nd = max(n, m);
        for (int l = 0; l < half; l++)
        {
                for (int x = 0; x <= nd; x++)
                        for (int y = 0; y <= nd; y++)
                        {
                                int a1 = x + 1, a2 = n - x;
                                int b1 = l - x + 1, b2 = m - (l - x);
                                int la = (a1 != a2), lb = (b1 != b2);

                                for (int fi = 0; fi <= la; fi++)
                                        for (int sc = 0; sc <= lb; sc++)
                                        {
                                                int va = (fi == 0) ? a[a1] : a[a2], vb = (sc == 0) ? b[b1] : b[b2];
                                                if (va == vb)
                                                        ndp[x + (fi == 0)][y + (sc == 0)] = add(ndp[x + (fi == 0)][y + (sc == 0)], dp[x][y]);
                                        }
                        }

                for (int x = 0; x <= nd; x++)
                        for (int y = 0; y <= nd; y++)
                        {
                                dp[x][y] = ndp[x][y];
                                ndp[x][y] = 0;
                        }
        }

        int ans = 0;
        for (int x = 0; x <= nd; x++)
                for (int y = 0; y <= nd; y++)
                        ans = add(ans, dp[x][y]);
        cout << ans << "\n";

        return 0;
}