维护字符'a'和'b'个数的前缀和num[0][], 和num[1][]。遍历字符串ch[],若遇到字符ch[j] == 'a,,则用二分查找在num[0]中找到第一个i,时num[0][i]-num[0[j]]+1 > k, 则ans = max(ans, i - j), 在用二分查找在num[1]中找到第一个i使num[1][i]-num[1][j]>k, 则ans = max(ans, i-j);
若遇到字符ch[j] == 'b',同理.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <algorithm>
#define maxn 100005
#define INF 1e9
typedef long long ll;
using namespace std;
int num[2][maxn];
char ch[maxn];
int main(){
// freopen("in.txt", "r", stdin);
int n, k;
scanf("%d%d%s", &n, &k, ch);
num[ch[0]-'a'][0] = 1;
for(int i = 1; i < n; i++){
int d = ch[i] - 'a';
num[d^1][i] = num[d^1][i-1];
num[d][i] = num[d][i-1] + 1;
}
int ans = 0;
for(int i = 0; i < n; i++){
int d = ch[i] - 'a';
int l = i, r = n;
while(l < r){
int mid = (l + r) >> 1;
if(num[d^1][mid] - num[d^1][i] <= k)
l = mid + 1;
else
r = mid;
}
ans = max(ans, l - i);
l = i, r = n;
while(l < r){
int mid = (l + r) >> 1;
if(num[d][mid] - num[d][i] + 1 <= k)
l = mid + 1;
else
r = mid;
}
ans = max(ans, l - i);
}
cout << ans << endl;
return 0;
}</span>
High school student Vasya got a string of length n as a birthday present. This string consists of letters 'a' and 'b' only. Vasya denotesbeauty of the string as the maximum length of a substring (consecutive subsequence) consisting of equal letters.
Vasya can change no more than k characters of the original string. What is the maximum beauty of the string he can achieve?
The first line of the input contains two integers n and k (1 ≤ n ≤ 100 000, 0 ≤ k ≤ n) — the length of the string and the maximum number of characters to change.
The second line contains the string, consisting of letters 'a' and 'b' only.
Print the only integer — the maximum beauty of the string Vasya can achieve by changing no more than k characters.
4 2 abba
4
8 1 aabaabaa
5
In the first sample, Vasya can obtain both strings "aaaa" and "bbbb".
In the second sample, the optimal answer is obtained with the string "aaaaabaa" or with the string "aabaaaaa".