Submission #819789

#TimeUsernameProblemLanguageResultExecution timeMemory
819789canadavid1Linear Garden (IOI08_linear_garden)C++14
100 / 100
121 ms45312 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) begin(x),end(x)

vector<array<int,9>> dp; // 5*diff + min + 2
vector<array<bool,9>> s;
int N,M;

int num_combinations(int off,int mins, int maxs)
{
    if(maxs > 2 || mins < -2) return 0;
    if(off >= N) return 1;
    mins = min(mins,0);
    maxs = max(maxs,0);
    if(s[off][maxs-3*mins]) return dp[off][maxs-3*mins];
    // try L
    int comb = 0;
    comb += num_combinations(off+1,mins-1,maxs-1);
    comb += num_combinations(off+1,mins+1,maxs+1);
    comb %= M;
    dp[off][maxs-3*mins] = comb;
    s[off][maxs-3*mins] = true;
    return comb;
}


signed main()
{
    cin >> N >> M;
    dp.assign(N,array<int,9>{});
    s.assign(N,array<bool,9>{});
    int off = 1;
    int mins = 0;
    int maxs = 0;
    for(int i = dp.size()-1; i >= 0; i--)
    {
        for(int mins = -2; mins <= 0; mins++)
        {
            for(int maxs = 0; maxs < 3; maxs++)
            {
                int64_t comb = 0;
                comb += num_combinations(i+1,mins-1,maxs-1);
                comb += num_combinations(i+1,mins+1,maxs+1);
                if(comb >= M) comb -= M;
                dp[i][maxs-3*mins] = comb;
                s[i][maxs-3*mins] = true;
            }
        }
    }
    for(int i = 0; i < N; i++)
    {
        char c;
        cin >> c;
        if(c=='P') off += num_combinations(i+1,mins-1,maxs-1);
        if(c=='P') {mins++;maxs++;}
        else {mins--;maxs--;}
        mins = min(mins,0);
        maxs = max(maxs,0);
        if(off>=M) off -= M;
    }
    cout << off << "\n";
}
#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...