题目描述
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个
串而言,每次操作可以把
字符改为
字符,或者把
字符改为
字符。所谓\mathit{“01”}“01”串,即只含字符
和字符
的字符串。
nozomi有最多 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注:
次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。
输入描述:
第一行输入两个正整数
和
输入仅有一行,为一个长度为 的、仅由字符
和
组成的字符串。
输出描述:
一个正整数,为满足条件的子串长度最大值。
输入
5 1
10101
输出
3
说明
只有
次操作机会。
将第二个位置的
改成
,字符串变成
,可以选出
子串,长度为
。
如果修改第三个或者第四个位置的字符也可以选出长度为
的子串。
题解
- 显然操作要么全1变0,要么全0变1。
分别处理两种操作即可。对于1变0的情况,可以分别统计每个1的前缀1和后缀1的位置(第一个1的前缀为 ,最后一个1的后缀为 ),那么 次操作,即变换连续 个1,最终的字符串长度就是第 个1的前缀1到第 个后缀1之间的距离。
对于0变1的情况同理。
AC-Code
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
int n, k;
while (cin >> n >> k) {
string s; cin >> s;
vector<int>v(2, 0);
int res = 0, max_num = 0;
for (int i = 0, j = 0; j < s.length(); ++j) {
++v[s[j] - '0'];
max_num = max(max_num, v[s[j] - '0']);
while (j - i + 1 - max_num > k)
--v[s[i++] - '0'];
res = max(res, j - i + 1);
}
cout << res << endl;
}
}