Cod sursa(job #3257917)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 19 noiembrie 2024 22:14:17
Problema Iv Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>

using namespace std;
const int NMAX = 200;
const int MOD = 3210121;
using ll = long long;

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

ll dp[NMAX + 2][NMAX + 2][NMAX + 2];
///dp[i1][j1][i2] - nr de sol pt un pal cu pref fm din i1 din a si j1 din b
///si ca suf i2 din a si i1 + j1 - i2 din b
int main()
{
    string a, b;
    cin >> a >> b;

    dp[0][0][0] = 1; ///init
    int mij = (a.size() + b.size()) / 2;

    for(int i1 = 0; i1 <= min((int)a.size(), mij); i1++) { ///CATE luam, NU pos
        for(int j1 = 0; j1 + i1 <= mij && j1 <= b.size(); j1++) { ///luam ca pe cub
            if(i1 == 0 && j1 == 0)
                continue;
            for(int i2 = 0; i2 <= a.size() - i1; i2++) {
                int j2 = i1 + j1 - i2;
                if(j2 + j1 > b.size() || j2 < 0)
                    continue;

                int posi1 = i1 - 1, posj1 = j1 - 1;
                int posi2 = a.size() - i2, posj2 = b.size() - j2;

                if(i1 != 0 && i2 != 0 &&    a[posi1] == a[posi2])
                    dp[i1][j1][i2] += dp[i1 - 1][j1][i2 - 1];
                if(i1 != 0 && j2 != 0 &&    a[posi1] == b[posj2])
                    dp[i1][j1][i2] += dp[i1 - 1][j1][i2];
                if(j1 != 0 && i2 != 0 &&    b[posj1] == a[posi2])
                    dp[i1][j1][i2] += dp[i1][j1 - 1][i2 - 1];
                if(j1 != 0 && j2 != 0 &&    b[posj1] == b[posj2])
                    dp[i1][j1][i2] += dp[i1][j1 - 1][i2];

                dp[i1][j1][i2] %= MOD;
                //cout << i1 << " " << j1 << " " << i2 << "  " << dp[i1][j1][i2] << '\n';
            }
        }
    }
    //cout << "traim";

    ll ans = 0;
    for(int i1 = 0; i1 <= min((int)a.size(), mij); i1++) {
        int j1 = mij - i1;
        if(j1 > b.size()) ///o sa mai scada
            continue;
        int i2 = a.size() - i1;
        int j2 = b.size() - j1;
        ans = (ans + dp[i1][j1][i2]) % MOD;
    }
    cout << ans;
    return 0;
}