题解 [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;
}
posted @ 2023-11-12 14:49  Chen_Jinhui  阅读(10)  评论(0)    收藏  举报  来源