Submission #754097

#TimeUsernameProblemLanguageResultExecution timeMemory
754097AndresRPerezLinear Garden (IOI08_linear_garden)C++17
63 / 100
71 ms65536 KiB
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6+1;
const int M = 3;

int n, m;
string s;

int mem [N][M][M];

int dp( int left, int width, int curr ){
    if( left == 0 ) return 1;
    int &ret = mem[left][width][curr];
    if( ret != -1 ) return ret;
    
    ret = 0;

    for( int nxt = -1 ; nxt <= 1 ; nxt += 2 ){
        int newCurr = curr + nxt;
        int newWidth = width;
        if( newCurr < 0 ){
            newWidth ++;
            newCurr ++;
        }else if( newCurr > newWidth ){
            newWidth ++;
        }
        if( newWidth > 2 ) continue;
        ret += dp( left-1, newWidth, newCurr );
        ret %= m;
    }
    return ret;
}

int main()
{   
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    memset(mem, -1, sizeof(mem));
    cin >> n >> m >> s ;
    
    int curr = 0, width = 0;
    int ans = 0;
    for( int i = 0 ; i < n ; i ++ ){
        if( s[i] == 'P' ){
            int newCurr = curr-1;
            int newWidth = width;
            if( newCurr < 0 ){
                newWidth ++;
                newCurr ++;
            }else if( newCurr > width ){
                newWidth ++;
            }
            int add = dp( n-i-1, newWidth, newCurr);
            //cout << "   -> add " << add << endl ;
            ans += add;
            ans %= m;
        }
        if( s[i] == 'L' ) curr --;
        else curr ++;
        if( curr < 0 ){
            width ++;
            curr ++;
        }else if( curr > width ){
            width ++;
        }
    }
    cout << ans+1 << endl ;

    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...