How to 金组T2
  • 板块学术版
  • 楼主DottedCalculator
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/15 05:07
  • 上次更新2024/12/15 09:57:08
查看原帖
How to 金组T2
302584
DottedCalculator楼主2024/12/15 05:07

我只想到了n2n^2 的做法,求优化,代码如下(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;
}
2024/12/15 05:07
加载中...