This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/******************************************************************************
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 B = 5;
const int M = 1<<B;
int n, m;
string s;
int mem [N][M];
bool checkBit( int mask , int b ){
return ( mask & (1<<b) ) > 0;
}
int addToMask( int mask , int newBit ){
mask <<= 1;
if( checkBit(mask, B) ) mask ^= (1<<B);
if( newBit ) mask |= 1;
return mask;
}
bool checkMask( int mask, int sz = B ){
if( sz <= 2 ) return true;
for( int i = 0 ; i+3 < sz ; i ++ ){
int cnt = 0;
for( int j = i ; j < sz ; j ++ ){
if( checkBit( mask, j ) ) cnt ++;
else cnt --;
if( abs(cnt) > 2 ) return false;
}
}
return true;
}
int dp( int left, int mask ){
//cout << "IN " << left << " " << mask << " :: sz " << min( n - left + 1, B ) << endl ;
if( left == 0 ) return 1;
int &ret = mem[left][mask];
if( ret != -1 ) return ret;
ret = 0;
int sz = min( n - left + 1, B );
for( int nxt = 0 ; nxt <= 1 ; nxt ++ ){
int newMask = addToMask( mask, nxt );
//cout << " TRY " << left-1 << " " << newMask << " from " << left << " " << mask << endl ;
if( checkMask( newMask , sz ) ){
ret += dp( left-1, newMask );
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 mask = 0, left = n;
int ans = 0;
for( int i = 0 ; i < n ; i ++ ){
if( s[i] == 'P' ){
ans += dp( n-i-1, addToMask( mask, 0 ) );
ans %= m;
}
if( s[i] == 'L' ) mask = addToMask( mask, 0 );
else mask = addToMask( mask, 1 );
}
cout << ans << endl ;
return 0;
}
Compilation message (stderr)
linear_garden.cpp: In function 'int main()':
linear_garden.cpp:74:19: warning: unused variable 'left' [-Wunused-variable]
74 | int mask = 0, left = n;
| ^~~~
# | 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... |