Cod sursa(job #3171333)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 18 noiembrie 2023 18:39:27
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>


using namespace std;

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

const int NMAX = 507;
const int MOD = 3210121;

int dp[2][NMAX][NMAX];

int main()
{
    string s1, s2;
    int n, m;
    fin >> s1 >> s2;

    s1 = " " + s1;
    s2 = " " + s2;

    n = s1.size() - 1;
    m = s2.size() - 1;

    if (s1[1] == s1[n])
        dp[1][1][1] = 1;
    if (s1[1] == s2[m])
        dp[1][1][0] = 1;
    if (s2[1] == s2[m])
        dp[1][0][0] = 1;
    if (s2[1] == s1[n])
        dp[1][0][1] = 1;

    int aux = 1;
    for (int k = 2; k <= (n + m) / 2; k++)
    {
        aux = 1 - aux;
        for (int i = 0; i <= n && i <= k; i++)
            for (int j = 0; i + j <= n && j <= k; j++)
            {
                dp[aux][i][j] = 0;
                if (s1[i] == s1[n - j + 1] && i >= 1 && n - j + 1 <= n)
                {
                    dp[aux][i][j] += dp[1 - aux][i - 1][j - 1];
                }
                if (s1[i] == s2[m - k + j + 1] && i >= 1 && m - k + j + 1 <= m)
                {
                    dp[aux][i][j] += dp[1 - aux][i - 1][j];
                }
                if (s2[k - i] == s1[n - j + 1] && k - i >= 1 && n - j + 1 <= n)
                {
                    dp[aux][i][j] += dp[1 - aux][i][j - 1];
                }
                if (s2[k - i] == s2[m - k + j + 1] && k - i >= 1 && m - k + j + 1 <= m)
                {
                    dp[aux][i][j] += dp[1 - aux][i][j];
                }

                dp[aux][i][j] %= MOD;
            }
    }

    int ans = 0;
    if ((n + m) % 2 == 0)
    {
        for (int i = 0; i <= n; i++)
        {
            ans += dp[aux][i][n - i];
            ans %= MOD;
        }
    }
    else
    {
        for (int i = 0; i <= n; i++)
        {
            ans += dp[aux][i][n - i] + dp[aux][i][n - i - 1];
            ans %= MOD;
        }
    }

    fout << ans;
    return 0;
}