传送门
将两种植物化作1和-1
发现后缀只会出现0,1,-1,2,-2
二进制压位存状态。
然后大力状压dp驶过。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,mo,c,ans,d[2][32][2];
char s[1000100];
int id(char ch){return ch=='L'?0:1;}
int main(){
scanf("%d%d%s",&n,&mo,s+1);
d[c][4][1]=1;
for (int i=1;i<=n;i++){
c^=1;
memset(d[c],0,sizeof(d[0]));
for (int j=0,jj;j<32;j++)
for (int k=0,kk;k<2;k++)
for (int l=0;l<2;l++){
if ((j&16)&&l) continue;
if ((j&1)&&!l) continue;
if (id(s[i])<l&&k) continue;
kk=(id(s[i])==l&k)?1:0;
jj=j;
if (l) (jj<<=1)|=8;
else (jj>>=1)|=2;
(d[c][jj][kk]+=d[1-c][j][k])%=mo;
}
}
for (int i=0;i<32;i++)
for (int j=0;j<2;j++)
(ans+=d[c][i][j])%=mo;
printf("%d",ans);
}