Cod sursa(job #3184985)

Utilizator TeodoraMaria123Serban Teodora Maria TeodoraMaria123 Data 17 decembrie 2023 15:38:01
Problema Iv Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.5 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;
    dp.resize(2, vector <vector <int> > (s1.size() + 1, vector <int> (s1.size() + 1)));

    int palSize = s1.size() + s2.size(), ind1 = 1, ind2 = 0;
    n = s1.size();
    m = s2.size();
    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]);

//    cout << dp[1][0][0] << " " << dp[1][0][1] << " " << dp[1][1][0] << " " << dp[1][1][1] << "\n";
    for(int i = 2; i <= palSize; i ++)
    {
        for(int st = 0; st <= s1.size(); st ++)
        {
            for(int dr = 0; dr <= s1.size(); dr ++)
            {
                dp[ind2][st][dr] = 0;
                // indicele curent dr in sirul 2 este m - i + dr
                if(st > 0  &&  m - i + dr < m  &&  s1[st - 1] == s2[m - i + dr]) // adaug din pr la stanga si din al doilea la dreapta
                    dp[ind2][st][dr] += dp[ind1][st - 1][dr];//, cout << "a";

                if(st > 0  &&  dr > 0  &&  s1[st] == s1[n - dr]) // adaug din pr la stanga si din pr la dreapta
                    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]) // adaug din al doilea la stanga si din primul la dreapta
                    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]) // adaug din al doilea la stanga si din al doilea la dreapta
                    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 & 1) //?
    {
        for(int i = 0; i <= n; i ++)
        {
            ans += dp[ind1][i][n - i - 1];
            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;
}