제출 #1309392

#제출 시각아이디문제언어결과실행 시간메모리
1309392khang2010Linear Garden (IOI08_linear_garden)C++20
100 / 100
49 ms36732 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

inline pair<int,int> next_state(int hi, int cur, char c) {
    int ncur = cur + (c == 'L' ? 1 : -1);
    int nhi = hi;

    if (ncur < 0) {
        nhi = hi + 1;
        ncur = 0;
    } else {
        nhi = max(hi, ncur);
    }

    if (nhi > 2) return {-1, -1};
    return {nhi, ncur};
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    ll M;
    string S;
    cin >> N >> M >> S;

    // ways[len][hi][cur]
    static int ways[1000001][3][3];

    // base: len = 0
    for (int h = 0; h <= 2; h++)
        for (int c = 0; c <= h; c++)
            ways[0][h][c] = 1;

    // build DP
    for (int len = 1; len <= N; len++) {
        for (int h = 0; h <= 2; h++) {
            for (int c = 0; c <= h; c++) {
                ll v = 0;
                for (char ch : {'L', 'P'}) {
                    auto [nh, nc] = next_state(h, c, ch);
                    if (nh != -1)
                        v += ways[len - 1][nh][nc];
                }
                ways[len][h][c] = v % M;
            }
        }
    }

    // compute rank
    ll rank = 1;
    int hi = 0, cur = 0;

    for (int i = 0; i < N; i++) {
        int rem = N - i - 1;

        if (S[i] == 'P') {
            auto [nh, nc] = next_state(hi, cur, 'L');
            if (nh != -1)
                rank = (rank + ways[rem][nh][nc]) % M;
        }

        auto [nh, nc] = next_state(hi, cur, S[i]);
        hi = nh;
        cur = nc;
    }

    cout << rank % M << '\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...