Cod sursa(job #3145994)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 17 august 2023 19:08:56
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>

std::ifstream cin("iv.in");
std::ofstream cout("iv.out");

const int MOD = 3210121;
int dp[2][505][505];
std::string s1, s2;
int n, m;
int rez;

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> s1 >> s2;

    n = s1.size();
    m = s2.size();
    
    s1 = "$" + s1;
    s2 = "$" + s2;
    
    dp[0][0][0] = 1;
    for(int i = 0; i <= n; i++)
        for(int j = 0; j + i <= n; j++)
            for(int x = std::max(0, j - i); x <= m; x++) {
                int y = i - j + x;

                if(x + y > m) {
                    x = m + 1;
                    continue;
                }

                int id = i & 1;
                int idAnt = (i + 1) & 1;
                int val = dp[i & 1][j][x];

                dp[id][j][x] = 0;
                if(i + j + x + y == n + m) {
                    rez = (rez + val) % MOD;
                    x = m + 1;
                    continue;
                }

                if(i + j + x + y == n + m - 1) {
                    rez = (rez + val) % MOD;
                    continue;
                }

                if(s1[i + 1] == s1[n - j])
                    dp[idAnt][j + 1][x] = (dp[idAnt][j + 1][x] + val) % MOD;

                if(s1[n - j] == s2[x + 1])
                    dp[id][j + 1][x + 1] = (dp[id][j + 1][x + 1] + val) % MOD;

                if(y < m) {
                    if(s2[x + 1] == s2[m - y])
                        dp[id][j][x + 1] = (dp[id][j][x + 1] + val) % MOD;
                    if(s1[i + 1] == s2[m - y])
                        dp[idAnt][j][x] = (dp[idAnt][j][x] + val) % MOD;
                }
            }

    cout << rez << '\n';
    return 0;
}