比赛 2026.4.4 评测结果 WWWWTTTTTT
题目名称 大括号 最终得分 0
用户昵称 郑霁桓 运行时间 6.713 s
代码语言 C++ 内存使用 7.93 MiB
提交时间 2026-04-04 12:24:52
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
long long p,q,r[5005],l[5005],pl,pr,pwl[5005],pwr[5005],as,sr[5005];
long long dl[5005][5005],dr[5005][5005],lp[5005],rp[5005],sl[5005],ls,rs;
long long pdl[5005],pdr[5005];
string s;
const long long M=666623333;
inline long long pw(long long x,int y){
    long long s=1;
    while(y){
        if(y&1) s*=x,s%=M;
        x*=x,x%=M,y>>=1;
    }
    return s;
}
int main(){
    freopen("brace.in","r",stdin);
    freopen("brace.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n>>p>>q>>a>>b;
    cin>>s;
    pwl[0]=pwr[0]=lp[0]=rp[0]=1;
    pl=p*pw(p+q,M-2)%M;
    pr=q*pw(p+q,M-2)%M;
    while(s[ls]=='L') ls++;
    while(s[n-rs-1]=='R') rs++;
    for(int i=1;i<=n;i++){
        sr[i]=sr[i-1]+(s[i-1]=='R');
        int p=i-2;
        pwl[i]=pwl[i-1]*pl%M;
        pwr[i]=pwr[i-1]*pr%M;
        if(s[i-1]=='L'){
            while(p>=0&&s[p]=='R') p--;
            l[i]=p+1;
        }
    }
    for(int i=n;i>=1;i--) sl[i]=sl[i+1]+(s[i-1]=='L');
    lp[1]=pr,rp[1]=pl;
    for(int i=2;i<=n;i++){
        lp[i]=lp[i-1]+(pwl[i-1]*pr)%M;
        lp[i]%=M;
        rp[i]=rp[i-1]+pwr[i-1]*pl%M;
        rp[i]%=M;
    }
    for(int i=n;i>=1;i--){
        int p=i;
        if(s[i-1]=='R'){
            while(p<n&&s[p]=='L') p++;
            r[i]=p+1;
        }
    }
    dl[0][0]=dr[n+1][0]=pdl[0]=pdr[n+1]=1;
    for(int i=1;i<=n;i++){
        if(s[i-1]=='R') continue;
        pdl[i]=pdl[l[i]]*lp[i-l[i]-1]%M;
        dl[i][1]=pdl[l[i]]*pwl[sr[i]]%M;
        for(int j=2;j<=min(a,i);j++){
            long long k=l[i],p=pw(pl,i-k-1);
            while(k>=j-1&&dl[k][j-1]){
                dl[i][j]=(dl[i][j]+dl[k][j-1]*p)%M;
                p=p*lp[k-l[k]-1]%M*pwl[k-l[k]-1]%M;
                if(!k) break;
                k=l[k];
            }
        }
    }
    for(int i=n;i>=1;i--){
        if(s[i-1]=='L') continue;
        pdr[i]=pdr[r[i]]*rp[r[i]-i-1]%M;
        dr[i][1]=pdr[r[i]]*pwr[sl[i]]%M;
        for(int j=2;j<=min(b,n-i+1);j++){
            long long k=r[i],p=pw(pr,k-i-1);
            while(n-k+1>=j-1&&dr[k][j-1]){
                dr[i][j]=(dr[i][j]+dr[k][j-1]*p)%M;
                p=p*rp[r[k]-k-1]%M*pwr[r[k]-k-1]%M;
                if(k==n+1) break;
                k=r[k];
            }
        }
    }
    if(ls==a&&rs==b){
        if(a+b==n) as=dl[a][a]*dr[a+1][b]%M;
        else as=0;
        cout<<as;
        return 0;
    }
    if(ls==a){
        as=dl[a][a]*dr[a+1][b]%M;
        cout<<as;
        return 0;
    }
    if(rs==b){
        as=dl[n-b][a]*dr[n-b+1][b]%M;
        cout<<as;
        return 0;
    }
    for(int i=1;i<n;i++){
        if(s[i-1]=='L'&&s[i]=='R') as=(as+dl[i][a]*dr[i+1][b])%M;
    }
    cout<<as;
    return 0;
}