Cod sursa(job #3170605)

Utilizator victor_gabrielVictor Tene victor_gabriel Data 17 noiembrie 2023 20:28:41
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int DIM = 510;
const int MOD = 3210121;

char s1[DIM], s2[DIM], S1[DIM], S2[DIM];
int dp[2][DIM][DIM];

int main() {
    fin >> S1 >> S2;

    strcpy(s1 + 1, S1);
    strcpy(s2 + 1, S2);
    int len1 = strlen(s1 + 1);
    int len2 = strlen(s2 + 1);

    int sol = 0, line = 0;
    dp[0][0][0] = 1;
    for (int i = 0; i <= len1; i++) {
        for (int j = 0; i + j <= len1; j++) {
            for (int k = 0; k <= len2; k++) {
                int l = i + k - j;
                if (l < 0 || l + k > len2) continue;

                if (i + j + k + l == len1 + len2 || i + j + k + l == len1 + len2 - 1) {
                    sol += dp[line][j][k];
                    sol %= MOD;
                }

                if (s1[i + 1] == s1[len1 - j]) {
                    dp[1 - line][j + 1][k] += dp[line][j][k];
                    dp[1 - line][j + 1][k] %= MOD;
                }

                if (l < len2 && s1[i + 1] == s2[len2 - l]) {
                    dp[1 - line][j][k] += dp[line][j][k];
                    dp[1 - line][j][k] %= MOD;
                }

                if (s2[k + 1] == s1[len1 - j]) {
                    dp[line][j + 1][k + 1] += dp[line][j][k];
                    dp[line][j + 1][k + 1] %= MOD;
                }

                if (l < len2 && s2[k + 1] == s2[len2 - l]) {
                    dp[line][j][k + 1] += dp[line][j][k];
                    dp[line][j][k + 1] %= MOD;
                }

                dp[line][j][k] = 0;
            }
        }
        line = 1 - line;
    }

    fout << sol;

    return 0;
}