Submission #1036570

#TimeUsernameProblemLanguageResultExecution timeMemory
1036570VMaksimoski008Linear Garden (IOI08_linear_garden)C++17
0 / 100
25 ms13432 KiB
#include <bits/stdc++.h>

#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
//#define int long long

using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int LOG = 20;
const int maxn = 1e5 + 5;

ll n, mod, ans = 0;
vector<ll> vec;
string s;

//neka L = -1 i P = 1
//togas abs(pref[i] - pref[j-1]) <= 2 za site i, j
//ako celo vreme cuvame min pref suma i max pref suma, treba abs(max - min) <= 2
//drugite 2 dimenzii se under i started

ll dp[1005][5][5][5][2];

ll f(int pos, int mn, int mx, int curr, int under) {
    if(mx - mn > 2) return 0;
    if(mx > 4 || mn < 0) return 0;
    if(pos == n + 1) return under;
    // cout << pos << " " << mn << " " << mx << " " << curr << " " << under << '\n';
    if(dp[pos][mn][mx][curr][under] != -1) return dp[pos][mn][mx][curr][under];

    ll ans = 0;

    //try putting -1
    int nc = curr - 1;
    int nmn = min(mn, curr - 1);
    int nmx = max(mx, curr - 1);
    int nu = under | (-1 < vec[pos]);
    ans = (ans + f(pos+1, nmn, nmx, nc, nu)) % mod;

    //try putting 1
    nc = curr + 1;
    nmn = min(mn, curr + 1);
    nmx = max(mx, curr + 1);
    nu = under | (1 < vec[pos]);
    ans = (ans + f(pos+1, nmn, nmx, nc, nu)) % mod;

    return dp[pos][mn][mx][curr][under] = ans;
}

signed main() {
    memset(dp, -1, sizeof(dp));
    cin >> n >> mod >> s;
    vec.push_back(0);

    for(int i=0; i<n; i++) {
        if(s[i] == 'L') vec.push_back(-1);
        else vec.push_back(1);
    }

    ll ans = f(1, 2, 2, 2, 0);
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...