Submission #1287400

#TimeUsernameProblemLanguageResultExecution timeMemory
1287400IBoryLinear Garden (IOI08_linear_garden)C++20
100 / 100
41 ms36760 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX = 1000007;
int dp[MAX][3][3];

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
    int N, MOD;
    string S;
    cin >> N >> MOD >> S;

    for (int idx = N; idx >= 0; --idx) for (int r = 0; r <= 2; ++r) for (int c = 0; c <= r; ++c) {
        if (idx == N) {
            dp[idx][r][c] = 1;
            continue;
        }
        dp[idx][r][c] = 0;
        if (!(r == 2 && c == 2)) {
            int nr = max(r, c + 1);
            dp[idx][r][c] = (dp[idx][r][c] + dp[idx + 1][nr][c + 1]) % MOD;
        }
        if (!(r == 2 && c == 0)) {
            int nr = (c == 0 ? r + 1 : r), nc = (c == 0 ? c : c - 1);
            dp[idx][r][c] = (dp[idx][r][c] + dp[idx + 1][nr][nc]) % MOD;
        }
    }

    int ans = 1, r = 0, c = 0;
    for (int i = 0; i < N; ++i) {
        if (S[i] == 'P') {
            int nr = (c == 0 ? r + 1 : r);
            int nc = (c == 0 ? c : c - 1);
            if (nc <= nr && nr <= 2) ans = (ans + max(0, dp[i + 1][nr][nc])) % MOD;
            r = max(r, ++c);
        }
        else {
            if (c == 0) r++;
            else c--;
        }
    }

    cout << ans;
	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...