Codeforces#354C (Div. 2) 二分答案

来源:互联网 发布:数据结构严蔚敏 知乎 编辑:程序博客网 时间:2024/06/05 01:01

题目链接: 原题


题意:题意很简单,有一个ab组成的串,大致就是找一个只有a或b的子串,里面有k个可以改变,问你最长这个子串能有多长?


思路:二分答案,O(n)判断就好了,之前要维护前缀和,很快就知道一个区间合法不合法了;


#include <bits/stdc++.h>using namespace std;int n,m;char s[1000005];int a[1000005],b[1000005];bool cal(int x){    if(x-a[x-1]<=m||x-b[x-1]<=m)            return true;    for(int i=1;i+x-1<n;i++){        if(x-(a[i+x-1]-a[i-1])<=m||x-(b[i+x-1]-b[i-1])<=m)            return true;    }    return false;}int main(){    scanf("%d%d",&n,&m);    scanf("%s",s);    if(s[0]=='a') a[0]=1;    else b[0]=1;    for(int i=1;i<n;i++){        if(s[i]=='a')a[i]=a[i-1]+1;        else a[i]=a[i-1];        if(s[i]=='b')b[i]=b[i-1]+1;        else b[i]=b[i-1];    }    int l=1,r=n;    while(l<=r){        int mid=(l+r)/2;        if(cal(mid)) l=mid+1;        else r=mid-1;    }    cout<<l-1;    return 0;}


0 0
原创粉丝点击