Cod sursa(job #2712646)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 26 februarie 2021 10:49:05
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 512;
const int mod = 3210121;
int dp[2][NMAX][NMAX];

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

int main() {
    string s, t;
    fin >> s >> t;
    int N = s.size(), M = t.size();
    s = '0' + s, t = '0' + t;
    dp[0][0][N + 1] = 1;
    int ans = 0;
    for(int p1 = 0; p1 <= N; ++p1) {
        for(int p2 = 0; p2 <= M; ++p2)
            for(int q1 = N + 1; q1 >= p1; --q1) {
                int q2 = N + M - p1 - p2 - q1 + 2;
                if(q2 < 0 || q2 < p2 || q2 > M + 1)
                    continue;
                if(p1 + 1 < q1 - 1 && s[p1 + 1] == s[q1 - 1])
                    add_self(dp[(p1 + 1) & 1][p2][q1 - 1], dp[p1 & 1][p2][q1]);
                if(p1 + 1 < q1 && p2 < q2 - 1 && s[p1 + 1] == t[q2 - 1])
                    add_self(dp[(p1 + 1) & 1][p2][q1], dp[p1 & 1][p2][q1]);
                if(p1 < q1 - 1 && p2 + 1 < q2 && s[q1 - 1] == t[p2 + 1])
                    add_self(dp[p1 & 1][p2 + 1][q1 - 1], dp[p1 & 1][p2][q1]);
                if(p2 + 1 < q2 - 1 && t[p2 + 1] == t[q2 - 1])
                    add_self(dp[p1 & 1][p2 + 1][q1], dp[p1 & 1][p2][q1]);
                if((p1 + 1 == q1 && p2 + 1 == q2) || ((p1 + 1 == q1 - 1 && p2 + 1 == q2) || (p2 + 1 == q2 - 1 && p1 + 1 == q1)))
                    add_self(ans, dp[p1 & 1][p2][q1]);
            }
        memset(dp[p1 & 1], 0, sizeof(dp[p1 & 1]));
    }
    fout << ans << '\n';
}