Cod sursa(job #2278148)

Utilizator DavidLDavid Lauran DavidL Data 7 noiembrie 2018 12:59:00
Problema Iv Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("iv.in");
ofstream fo("iv.out");

const int NMAX = 55;
const int MOD = 3210121;

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

void add(int &a, int b)
{
    a = (a + b) % MOD;
}

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

    int rez = 0;

    dp[0][n + 1][0][m + 1] = 1;

    for (int stA = 0; stA <= n; stA++)
    {
        for (int drA = n + 1; drA > stA; drA--)
        {
            for (int stB = 0; stB <= m; stB++)
            {
                for (int drB = m + 1; drB > stB; drB--)
                {
                    if (stA >= 1 && drB <= m)
                        if (A[stA] == B[drB])
                            add(dp[stA][drA][stB][drB], dp[stA - 1][drA][stB][drB + 1]);

                    if (stA >= 1 && drA <= n)
                        if (A[stA] == A[drA])
                            add(dp[stA][drA][stB][drB], dp[stA - 1][drA + 1][stB][drB]);

                    if (stB >= 1 && drA <= n)
                        if (B[stB] == A[drA])
                            add(dp[stA][drA][stB][drB], dp[stA][drA + 1][stB - 1][drB]);

                    if (stB >= 1 && drB <= m)
                        if (B[stB] == B[drB])
                            add(dp[stA][drA][stB][drB], dp[stA][drA][stB - 1][drB + 1]);


                    if (drA == stA + 1 && drB == stB + 1)
                        add(rez, dp[stA][drA][stB][drB]);
                }

            }
        }
    }

    fo << rez;

    return 0;
}