Cod sursa(job #3185061)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 17 decembrie 2023 18:58:45
Problema Iv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <bits/stdc++.h>

using namespace std;

const int mod = 3210121;

int n, m;
string s1, s2;
vector <vector <vector <int> > > dp;

int main()
{
    ios_base :: sync_with_stdio(0);
    cin.tie(0);

    freopen("iv.in", "r", stdin);
    freopen("iv.out", "w", stdout);

    cin >> s1 >> s2;
    n = s1.size();
    m = s2.size();

    dp.resize(2, vector <vector <int> > (n + 1, vector <int> (n + 1)));

    int palSize = n + m, ind1 = 1, ind2 = 0;
    palSize >>= 1;

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

    for(int i = 2; i <= palSize; i ++)
    {
        int endSt = min(n, palSize);
        for(int st = 0; st <= endSt; st ++)
        {
            int endDr = min(n - st, palSize);
            for(int dr = 0; dr <= endDr; dr ++)
            {
                // indicele curent dr : s2 => m - i + dr

                dp[ind2][st][dr] = 0;
                if(st > 0  &&  m - i + dr < m  &&  s1[st - 1] == s2[m - i + dr]) // st : s1; dr : s2
                    dp[ind2][st][dr] += dp[ind1][st - 1][dr];//, cout << "a";

                if(st > 0  &&  dr > 0  &&  s1[st - 1] == s1[n - dr]) // st : s1; dr : s1
                    dp[ind2][st][dr] += dp[ind1][st - 1][dr - 1];//, cout << "b";

                if(dr > 0  &&  i - st - 1 >= 0  &&  s2[i - st - 1] == s1[n - dr]) // st : s2; dr : s1
                    dp[ind2][st][dr] += dp[ind1][st][dr - 1];//, cout << "c";

                if(i - st - 1 >= 0  &&  m - i + dr < m  &&  s2[i - st - 1] == s2[m - i + dr]) // st : s2; dr : s2
                    dp[ind2][st][dr] += dp[ind1][st][dr];//, cout << "d";

                dp[ind2][st][dr] %= mod;
//                cout << " " << st << " " << dr << " " << dp[ind2][st][dr]<< "\n";
            }
        }

        swap(ind2, ind1);
    }

    int ans = 0;
    if((n + m) % 2)
    {
        for(int i = 0; i <= n; i ++)
        {
            ans += dp[ind1][i][n - i - 1];
            if(ans >= mod)
                ans -= mod;
            ans += dp[ind1][i][n - i];
            if(ans >= mod)
                ans -= mod;
        }
        cout << ans;
        return 0;
    }
    for(int i = 0; i <= n; i ++)
    {
        ans += dp[ind1][i][n - i];
        if(ans >= mod)
            ans -= mod;
    }
    cout << ans;
    return 0;
}