| 比赛 |
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;
}