题目链接: 原题
题意:题意很简单,有一个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;
}