题解 [ABC328C] Consecutive
题解区里清一色前缀和的做法,来补一个二分的。虽然时间复杂度还要劣一点。
题意
给一个长度为 $N$ 的字符串 $S$,有 $Q$ 个询问,每次询问有多少个 $i \in [L,R), S_i=S_{i+1}$。
分析
直接存下所有满足 $i \in [L,R), S_i=S_{i+1}$ 的位置。
求个数的时候让我想起来前几天的【LGR-166-Div.4】洛谷入门赛 #17,这个 H 题的询问数据范围极大所以我用了二分。
然后我想都没想就这样实现了,从来没往前缀和的方向上面想。
时间复杂度 $O(N + Q \log N)$。
代码
//the code is from chenjh
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,q;
char s[300003];
vector<int> v;
int main(){
cin>>n>>q>>(s+1);
for(int i=1;i<n;i++)if(s[i]==s[i+1]) v.push_back(i);//找到满足的就加入。
for(int l,r;q--;){
cin>>l>>r;
cout<<(
(upper_bound(v.begin(),v.end(),r-1)-v.begin()-1)-
(lower_bound(v.begin(),v.end(),l)-v.begin()-1)
)<<'\n';//找到最后一个小于 r-1 的位置和最后一个小于 l 的位置,相减即个数。
}
return 0;
}

浙公网安备 33010602011771号