AT_dwacon5th_prelims_c k-DMC 题解

分析

先考虑 k=n 的情况。

对于 sj=M 的时候,其能够匹配的 si=D 的数量很显然是 ij1 的时候的数量,求前缀和就能得到。而对于 sj=C 的时候,能够完整匹配的就是 ij1 的时候所有 si=M 能够匹配的数量之和,再套个前缀和就行了。复杂度是 O(n) 的。

考虑 3kn 的情况。

和上面的差不多,对于 sj=C 的时候,它能够得到贡献的 M,D 都是在 [jk+1,j] 的。处理这个,只需要在 jk 没有越界的时候减去 sjk 的贡献。如果 sjk=M,因为 sjk 之前所有的 Dj 的贡献都减完了,所以将 M 出现数量的和 1(这个后面会用到)。如果 sjk=D,其贡献是 [jk+1,j]M 的数量,这个已经统计出来了,直接剪掉即可。如果 sjk=C,则不理会,因为它本身不会产生贡献。至于 sj=M,D 的情况,跟 k=n 的时候差不多,只需要注意 M 的数量。

单次询问的答案就是所有 sj=C 的时候得到贡献之和。复杂度 O(qn)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
#define il inline
#define PII pair<int,int>
#define x first
#define y second 

const int N=1e6+10;
int n,q,k;
string s;

il void solve(){
	cin>>n>>s>>q;
	while(q--){
		cin>>k;
		int ans=0,sum_d=0,sum_m=0,sum=0;
		for(re int i=0;i<n;++i){
			if(i-k>=0){
				if(s[i-k]=='D') sum-=sum_m,--sumd;
				if(s[i-k]=='M') --sum_m;
			}
			if(s[i]=='D') ++sum_d;
			if(s[i]=='M') sum+=sum_d,++sum_m;
			if(s[i]=='C') ans+=sum;
		}
		cout<<ans<<"\n";
	}
	return ;
}

signed main(){
	solve();
	return 0;
}

posted @   harmis_yz  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示