#include <bits/stdc++.h>
using namespace std;
// N up to 1,000,000 → we keep L as [N+2][3][3][2]
static long long L[1000002][3][3][2];
static int S[1000002];
long long N, M;
// Recursive function similar to Pascal's Tinh()
long long Tinh(int i, int hl, int hp, int ok) {
// Already computed → return memoized
if (L[i][hl][hp][ok] != -1)
return L[i][hl][hp][ok];
// Base: past the last position → 1 valid completion
if (i > N)
return L[i][hl][hp][ok] = 1 % M;
long long ans = 0;
// ----- Try placing 'L' (0) -----
if (hl < 2) { // cannot exceed balance
int nextOk = ok | (0 < S[i]); // becomes 1 if we place smaller than target
ans = Tinh(i + 1, hl + 1, max(0, hp - 1), nextOk);
}
// ----- Try placing 'P' (1) -----
if ((ok == 1 || S[i] == 1) && hp < 2) { // allowed only if <= target
int nextOk = ok | (1 < S[i]); // actually stays same
ans += Tinh(i + 1, max(0, hl - 1), hp + 1, nextOk);
}
return L[i][hl][hp][ok] = ans % M;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> M;
string garden;
cin >> garden;
// Convert garden letters to 0/1 for easier compare
for (int i = 1; i <= N; ++i) {
S[i] = (garden[i - 1] == 'P' ? 1 : 0);
}
// Initialize DP array to -1 (uncomputed)
for (int i = 0; i <= N + 1; ++i)
for (int hl = 0; hl < 3; ++hl)
for (int hp = 0; hp < 3; ++hp)
for (int ok = 0; ok < 2; ++ok)
L[i][hl][hp][ok] = -1;
long long result = Tinh(1, 0, 0, 0);
result = (result % M + M) % M; // make sure non-negative
cout << result << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |