题目链接:https://ac.nowcoder.com/acm/contest/3002/H
显然操作要么全1变0,要么全0变1。
尺取法:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+5;
char q[maxn];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",q+1);
int ans1=0;
int ans2=0;
int num[2];
memset(num,0,sizeof(num));
for(int i=1,j=1;i<=n;i++) ///1 ->0
{
if(q[i]=='0')
{
num[0]++;
}
while(i-j+1-num[0]>k) ///当子串中1的个数大于可修改的次数,则j向右移动
{
if(q[j]=='0') /// 易忽略
{
num[0]--;
}
j++;
}
ans1=max(ans1,i-j+1);
}
for(int i=1,j=1;i<=n;i++) /// 0->1
{
if(q[i]=='1')
{
num[1]++;
}
while(i-j+1-num[1]>k)
{
if(q[j]=='1')
{
num[1]--;
}
j++;
}
ans2=max(ans2,i-j+1);
}
int ans=max(ans1,ans2);
printf("%d\n",ans);
}