Cod sursa(job #3171349)

Utilizator mihaistamatescuMihai Stamatescu mihaistamatescu Data 18 noiembrie 2023 19:00:24
Problema Iv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <cstring>

#define DIM 510
#define MOD 3210121
using namespace std;

int n, m, lg, sol, l;
char s1[DIM], s2[DIM];
int D[2][DIM][DIM];

int main() {
    ifstream fin("iv.in");
    ofstream fout("iv.out");
    fin >> (s1 + 1) >> (s2 + 1);
    n = strlen(s1 + 1);
    m = strlen(s2 + 1);
    sol = 0, l = 0;
    D[0][0][0] = 1;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; i + j <= n; j++) {
            for (int k = 0; k <= m; k++) {
                lg = i + k - j;
                if (lg < 0 || lg + k > m) {
                    continue;
                }
                if (i + j + k + lg == n + m || i + j + k + lg == n + m - 1) {
                    sol += D[l][j][k];
                    sol %= MOD;
                }
                if (s1[i + 1] == s1[n - j]) {
                    D[1 - l][j + 1][k] += D[l][j][k];
                    D[1 - l][j + 1][k] %= MOD;
                }
                if (lg < m && s1[i + 1] == s2[m - lg]) {
                    D[1 - l][j][k] += D[l][j][k];
                    D[1 - l][j][k] %= MOD;
                }
                if (s2[k + 1] == s1[n - j]) {
                    D[l][j + 1][k + 1] += D[l][j][k];
                    D[l][j + 1][k + 1] %= MOD;
                }
                if (lg < m && s2[k + 1] == s2[m - lg]) {
                    D[l][j][k + 1] += D[l][j][k];
                    D[l][j][k + 1] %= MOD;
                }
                D[l][j][k] = 0;
            }
        }
        l = 1 - l;
    }
    fout << sol;
    return 0;
}