链接:https://ac.nowcoder.com/acm/contest/3002/H
来源:牛客网
题目描述
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 “01”串而言,每次操作可以把0字符改为1字符,或者把1字符改为0字符。所谓“01”串,即只含字符0和字符1的字符串。
nozomi有最多k次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注:k次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。
输入描述:
第一行输入两个正整数n和k
输入仅有一行,为一个长度为n的、仅由字符0和1组成的字符串。
输出描述:
一个正整数,为满足条件的子串长度最大值。
示例1
输入
5 1
10101
输出
3
说明
只有 次操作机会。
将第二个位置的0改成1,字符串变成 111011,可以选出 “111”子串,长度为3。
如果修改第三个或者第四个位置的字符也可以选出长度为3的子串。
题解
分成两种情况
- 所有操作都是0变1
- 所有操作都是1变0
对于1变0的情况,可以分别统计每个1的前缀1和后缀1的位置(第一个1的前缀为0,最后一个1的后缀为n+1),那么k次操作,即变换连续k个1,最终的字符串长度就是第i个1的前缀1到第i + k个后缀1之间的距离。
对于0变1的情况同理。
代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> v0,v1;
string s;
int main()
{
int n,k;
cin>>n>>k;
cin>>s;
v0.push_back(-1);
v1.push_back(-1);
for(int i=0;i<n;i++){
if(s[i]=='0')
v0.push_back(i);
else
v1.push_back(i);
}
v0.push_back(n);
v1.push_back(n);
int maxx=0;
// 0变1
if(v0.size()-2<=k)
maxx=n;
else{
for(int i=1,j=k;j<v0.size()-1;i++,j++){
maxx=max(maxx,v0[j+1]-v0[i-1]-1);
}
}
// 1变0
if(v1.size()-2<=k)
maxx=n;
else{
for(int i=1,j=k;j<v1.size()-1;i++,j++){
maxx=max(maxx,v1[j+1]-v1[i-1]-1);
}
}
cout<<maxx<<endl;
return 0;
}