Cod sursa(job #3171539)

Utilizator juincPopescu Marian juinc Data 19 noiembrie 2023 00:02:00
Problema Iv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <cstring>
#define MOD 3210121
#define DIM 510

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

int s1_max, s2_max, total, sum;
char s1[DIM], s2[DIM];
int v1[DIM][DIM], v2[DIM][DIM];

int main() {
    fin >> (s1 + 1) >> (s2 + 1);

    s1_max = strlen(s1 + 1);
    s2_max = strlen(s2 + 1);
    total = s1_max + s2_max;

    if (s1[1] == s1[s1_max])
        v2[1][1] = 1;
    if (s1[1] == s2[s2_max])
        v2[1][0] = 1;
    if (s2[1] == s2[s2_max])
        v2[0][0] = 1;
    if (s2[1] == s1[s1_max])
        v2[0][1] = 1;

    for (int i = 2; i <= total / 2; i++) {
        for (int j = 0; j <= s1_max; j++) {
            for (int k = 0; k <= s1_max; k++) {
                if ((2 * i - j - k) <= s2_max && (j + k) <= s1_max) {
                    if (s1[j] == s1[s1_max - k + 1])
                        v1[j][k] += v2[j - 1][k - 1];
                    if (s1[j] == s2[s2_max - (i - k) + 1])
                        v1[j][k] += v2[j - 1][k];
                    if (s2[i - j] == s2[s2_max - (i - k) + 1])
                        v1[j][k] += v2[j][k];
                    if (s2[i - j] == s1[s1_max - k + 1])
                        v1[j][k] += v2[j][k - 1];
                    while (v1[j][k] >= MOD)
                        v1[j][k] -= MOD;
                }
            }
        }
        memcpy(v2, v1, sizeof(v1));
        memset(v1, 0, sizeof(v1));
    }

    for (int i = 0; i <= s1_max; i++)
        for (int j = 0; j <= s1_max; j++)
            sum += v2[i][j];

    fout << sum;

    return 0;
}