Submission #115074

# Submission time Handle Problem Language Result Execution time Memory
115074 2019-06-05T06:22:27 Z zubec Linear Garden (IOI08_linear_garden) C++14
100 / 100
113 ms 36740 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;

int n, m, dp[2][1000100][2][2];

int a[1000100];

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);

    cin >> n >> m;

    for (int i = 1; i <= n; i++){
        char c;
        cin >> c;
        a[i] = (c == 'P');
    }
    if (a[1] == 0){
        dp[1][1][0][0] = 1;
        dp[1][1][0][1] = 1;
    } else {
        dp[0][1][0][0] = 1;
        dp[0][1][0][1] = 1;
        dp[1][1][1][0] = 1;
        dp[1][1][1][1] = 1;
    }
    for (int i = 1; i < n; i++){
        for (int cur = 0; cur < 2; cur++){
            for (int nxt = 0; nxt < 2; nxt++){
                for (int pref = 0; pref < 2; pref++){
                    if (pref && nxt > a[i+1])
                        continue;
                    for (int used = 0; used < 2; used++){
                        if (cur == nxt && cur == 0 && used == 1)
                            continue;
                        if (cur == nxt && cur == 1 && used == 0)
                            continue;
                        int nxtpref = pref;
                        if (nxt < a[i+1])
                            nxtpref = 0;
                        int nxtused = used;
                        if (cur == nxt)
                            nxtused ^= 1;
                        dp[nxtpref][i+1][nxt][nxtused] = (dp[nxtpref][i+1][nxt][nxtused] + dp[pref][i][cur][used])%m;
                    }
                }
            }
        }
    }
    int ans = 0;
    for (int pref = 0; pref < 2; pref++){
        ans = (ans + dp[pref][n][0][0])%m;
        ans = (ans + dp[pref][n][1][0])%m;
        ans = (ans + dp[pref][n][0][1])%m;
        ans = (ans + dp[pref][n][1][1])%m;
    }

    memset(dp, 0, sizeof(dp));

    if (a[1] == 0){
        dp[1][1][0][0] = 1;
    } else {
        dp[0][1][0][0] = 1;
        dp[1][1][1][0] = 1;
    }
    for (int i = 1; i < n; i++){
        for (int cur = 0; cur < 2; cur++){
            for (int nxt = 0; nxt < 2; nxt++){
                if (cur == nxt)
                    continue;
                for (int pref = 0; pref < 2; pref++){
                    if (pref && nxt > a[i+1])
                        continue;
                    for (int used = 0; used < 2; used++){
                        if (cur == nxt && cur == 0 && used == 1)
                            continue;
                        if (cur == nxt && cur == 1 && used == 0)
                            continue;
                        int nxtpref = pref;
                        if (nxt < a[i+1])
                            nxtpref = 0;
                        int nxtused = used;
                        if (cur == nxt)
                            nxtused ^= 1;
                        dp[nxtpref][i+1][nxt][nxtused] = (dp[nxtpref][i+1][nxt][nxtused] + dp[pref][i][cur][used])%m;
                    }
                }
            }
        }
    }
    int ans2 = 0;
    for (int pref = 0; pref < 2; pref++){
        ans2 = (ans2 + dp[pref][n][0][0])%m;
        ans2 = (ans2 + dp[pref][n][1][0])%m;
    }
    ans = (ans - ans2 + m)%m;

    cout << ans;


}

/**

5 7
LLPPL

5 1000
LPLPL

*/
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31704 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31744 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31736 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 31744 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31744 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 23 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 31616 KB Output is correct
2 Correct 24 ms 31736 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 31716 KB Output is correct
2 Correct 24 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 31736 KB Output is correct
2 Correct 29 ms 31632 KB Output is correct
3 Correct 25 ms 31616 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 31736 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 31836 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 30 ms 31944 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 32 ms 32000 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 52 ms 33216 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 62 ms 33660 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 69 ms 34164 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 80 ms 34680 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 113 ms 36620 KB Output is correct
2 Correct 110 ms 36584 KB Output is correct
3 Correct 108 ms 36740 KB Output is correct