Cod sursa(job #2718006)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 8 martie 2021 12:27:42
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

#define MOD 3210121
#define NMAX 505
using namespace std;

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

int dp[2][NMAX][NMAX], p;
char a[NMAX], b[NMAX];

void addSelf(int &val1, int val2){
    val1 += val2;
    if(val1 >= MOD)
        val1 -= MOD;
}

int main()
{
    fin >> (a + 1) >> (b + 1);

    int n = strlen(a + 1);
    int m = strlen(b + 1);
    int lgS = n + m, rez = 0;
    dp[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)
            {
                int q = i + k - j;
                if(q < 0 || q + k > m)
                    continue;

                if(i + j + k + q == lgS || i + j + k + q == lgS - 1){
                    addSelf(rez, dp[p][j][k]);
                    continue;
                }
                if(a[i + 1] == a[n - j])
                    addSelf(dp[1 - p][j + 1][k], dp[p][j][k]);
                if(m - q >= 1 && b[k + 1] == b[m - q])
                    addSelf(dp[p][j][k + 1], dp[p][j][k]);
                if(m - q >= 1 && b[m - q] == a[i + 1])
                    addSelf(dp[1 - p][j][k], dp[p][j][k]);
                if(a[n - j] == b[k + 1])
                    addSelf(dp[p][j + 1][k + 1], dp[p][j][k]);
                dp[p][j][k] = 0;
            }
        p = 1 - p;
    }
    fout << rez << '\n';
    return 0;
}