Cod sursa(job #1733395)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 24 iulie 2016 16:57:16
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int n, m;
char s1[NMAX], s2[NMAX];

int dp[NMAX][NMAX][NMAX];

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

int main()
{
    ifstream cin("iv.in");
    ofstream cout("iv.out");

    cin.get(s1 + 1, NMAX); cin.get();
    cin.get(s2 + 1, NMAX); cin.get();

    n = strlen(s1 + 1);
    m = strlen(s2 + 1);

    int len = n + m;

    dp[0][0][0] = 1;
    bool h = 0;
    for (int l = 0; l < (len + 1) / 2; ++ l, h ^= 1) {
        memset(dp[h ^ 1], 0, sizeof(dp[h ^ 1]));

        for (int a = 0; a <= n; ++ a)
            for (int b = 0; a + b <= n; ++ b) {
                int a_prim = l - a;
                int b_prim = l - b;

                if (a_prim + b_prim <= m) { //Daca starea are sens
                    if ((len & 1) && l == (len + 1) / 2 - 1) { //Litera din mijloc
                        if (a + 1 == n - b)
                            add(dp[h ^ 1][a + 1][b], dp[h][a][b]);
                        else
                            add(dp[h ^ 1][a][b], dp[h][a][b]);
                    }
                    else {
                        //sus - sus
                        if (a + 1 < n - b && s1[a + 1] == s1[n - b])
                            add(dp[h ^ 1][a + 1][b + 1], dp[h][a][b]);

                        //jos - jos
                        if (a_prim + 1 < m - b_prim && s2[a_prim + 1] == s2[m - b_prim])
                            add(dp[h ^ 1][a][b], dp[h][a][b]);

                        if (a + 1 <= n - b && a_prim + 1 <= m - b_prim) {
                            //sus - jos
                            if (s1[a + 1] == s2[m - b_prim])
                                add(dp[h ^ 1][a + 1][b], dp[h][a][b]);

                            //jos - sus
                            if (s2[a_prim + 1] == s1[n - b])
                                add(dp[h ^ 1][a][b + 1], dp[h][a][b]);
                        }
                    }
                }
            }
    }

    int ans = 0;
    for (int a = 0; a <= n; ++ a)
        for (int b = 0; a + b <= n; ++ b)
            add(ans, dp[h][a][b]);

    cout << ans << '\n';

    cin.close();
    cout.close();
    return 0;
}