#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<limits.h>
#include<math.h>
#include<map>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<iomanip>
#include<cstring>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
using namespace std;
//const int MOD=1e9+7;
//typedef pair<ll,ll>Point;
//typedef pair<ll,ll>Line;
//#define x first
//#define y second
ll MOD;
int n;
string str;
ll dp1[5][3][3];
ll dp2[5][3][3];
ll get(int i,int pref,int min_pref,int max_pref){
min_pref=min(min_pref,pref);
max_pref=max(max_pref,pref);
if(max_pref-min_pref>2)
return 0;
if(i==n)
return 1;
return (dp2[pref+1+2][-min_pref][max_pref]+dp2[pref-1+2][-min_pref][max_pref])%MOD;
}
void solve(){
cin>>n>>MOD>>str;
int pref=0,min_pref=0,max_pref=0;
vector<int>prefv(n),min_prefv(n),max_prefv(n);
for(int i=0;i<n;i++){
prefv[i]=pref;
min_prefv[i]=min_pref;
max_prefv[i]=max_pref;
if(str[i]=='P')
pref++;
else
pref--;
min_pref=min(min_pref,pref);
max_pref=max(max_pref,pref);
}
ll res=1;
for(int i=n-1;i>=0;i--){
if(str[i]=='P'){
res+=get(i+1,prefv[i]-1,min_prefv[i],max_prefv[i]);
res%=MOD;
}
for(int i1=0;i1<5;i1++){
for(int i2=0;i2<3;i2++){
for(int i3=0;i3<3;i3++){
dp1[i1][i2][i3]=get(i+1,i1-2,-i2,i3);
}
}
}
memcpy(dp2,dp1,sizeof(dp1));
}
cout<<res<<"\n";
}
int main(){
ios::sync_with_stdio(false);cout.tie(NULL);cin.tie(NULL);
//freopen("bank.in","r",stdin);freopen("bank.out","w",stdout);
int t=1;//cin>>t;
while(t--)solve();
return 0;
}
/*
14:
LLPLP
LLPPL
LPLLP
LPLPL
LPLPP
LPPLL
LPPLP
PLLPL
PLLPP
PLPLL
PLPLP
PLPPL
PPLLP
PPLPL
5 7 PLPPL
5
12 10000 LPLLPLPPLPLL
39
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
600 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
604 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
604 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
9 ms |
1116 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
11 ms |
1372 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
50 ms |
4524 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
65 ms |
5688 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
76 ms |
6892 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
109 ms |
8440 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
158 ms |
13304 KB |
Output is correct |
2 |
Correct |
163 ms |
14128 KB |
Output is correct |
3 |
Correct |
139 ms |
14276 KB |
Output is correct |