题目描述:
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 \mathit{“01”}“01”串而言,每次操作可以把 \mathit00 字符改为 \mathit11 字符,或者把 \mathit11 字符改为 \mathit00 字符。所谓\mathit{“01”}“01”串,即只含字符 \mathit00 和字符 \mathit11 的字符串。
nozomi有最多 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。(G题)
分析:此题也是一个处理字符串的题目,在我看来本题的难点在于最长,因此无法 像G题般找出刚符合符合条件的字串然后在首尾相减,于是要用到另一个算法,尺取法。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k;
char a11[200100];
int myfunction(char a,char a1)
{
int r=0,l=0,change=0,ans=0;//r为右指针,l为左指针
for(int i=0;i<n;i++)
{
if(a11[i]==a)
{
if(change<k)//还未达到k次操作时右指针向右移
{
change++;
r++;
}
else
{
while(a11[l]!=a&&l<=r)
l++;//此时操作次数已满,左指针像右移直到指向a
l++;
r++; //左右指针同时右移,纳入一个a,抛弃一个a,此时a的数量依然为k,再判断此串的长度
}
}
else
r++;//不消耗操作次数,右指针像右移
ans=max(ans,r-l);
}
return ans;
}
int main()
{
cin>>n>>k;
scanf("%s",&a11);
cout<<max(myfunction('0','1'),myfunction('1','0'));
return 0;
}