我只想到了n2 的做法,求优化,代码如下(certified比赛时间已经结束):
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+7;
int main(){
int n;
cin>>n;
string s;
cin>>s;
long long dp[500010]={0};
if(s[0]=='X') dp[0]=1;
else dp[0]=0;
int lstb[500010]={0},lstr[500010]={0};
if(s[0]=='X') {lstb[0]=-1;lstr[0]=-1;}
if(s[0]=='R') {lstb[0]=-1;lstr[0]=0;}
if(s[0]=='B') {lstb[0]=0;lstr[0]=-1;}
for(int i=1;i<n;i++){
if(s[i]=='R') lstr[i]=i;
else lstr[i]=lstr[i-1];
if(s[i]=='B') lstb[i]=i;
else lstb[i]=lstb[i-1];
int ma=min(i-lstr[i],(i+1)/2);
for(int j=1;j<=ma;j++){
if(lstb[i-j]<=i-j*2){
if(i-j*2==-1) dp[i]=(dp[i]+1)%MOD;
else dp[i]=(dp[i]+dp[i-2*j])%MOD;
}
}
if(s[i]=='X') dp[i]=(dp[i]+dp[i-1])%MOD;
}
cout<<(dp[n-1]+MOD)%MOD;
return 0;
}