描述
给一个 n 个字符(只含 a 或 b )的字符串,通过改变当中的 k 个字符( a 改为 b , b 改为 a ),求改变后字符串的连续子序列(只含 a ,或者只含 b )的最大长度。
输入
第一行包含两个正整数n和k, (1 ≤ n ≤ 100 000, 0 ≤ k ≤ n。n是字符串的长度,k是能够最大改变的字符的个数。
字符串只包含 ‘a’ 和 ‘b’。
输出
改变后字符串的连续子序列(只含 a ,或者只含 b )的最大长度。
输入样例 1
4 2
abba
输出样例 1
4
输入样例 2
8 1
aabaabaa
输出样例 2
5
提示
第一个样例, Vasya 能够获得 “aaaa” and “bbbb”。
第二个样例, 最好的答案是"aaaaabaa" 或者 “aabaaaaa”。
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
char str[MAXN];
int letterA[MAXN], letterB[MAXN];
int main() {
int n, k, cnt;
int k1, k2;
int len1 = 0, len2 = 0;
int ans1 = 0, ans2 = 0;
scanf("%d %d %s", &n, &k, str);
k1 = k2 = k;
for (int i = 0; ; ) {
cnt = 0;
while (str[i] != 'b') {
if (i >= n) break;
cnt++;
i++;
}
letterA[len1] = cnt;
len1++;
i++;
if (i >= n) {
if (str[n - i] == 'b') {
letterA[len1] = 0;
len1++;
}
break;
}
}
for (int i = 0; ; ) {
cnt = 0;
while (str[i] != 'a') {
if (i >= n) break;
cnt++;
i++;
}
letterB[len2] = cnt;
len2++;
i++;
if (i >= n) {
if (str[n - i] == 'a') {
letterB[len2] = 0;
len2++;
}
break;
}
}
if (len1 - k <= 0) {
ans1 = (k - len1 - 1) % 2 ? n - 1 : n;
} else {
for (int i = 0; i < len1 - k; i++) {
cnt = 0;
for (int j = i; j <= i + k; j++) {
cnt += letterA[j];
}
if (i == 0) ans1 = cnt + k;
else ans1 = max(ans1, cnt + k);
}
}
if (len2 - k <= 0) {
ans2 = (k - len2 - 1) % 2 ? n - 1 : n;
} else {
for (int i = 0; i < len2 - k; i++) {
cnt = 0;
for (int j = i; j <= i + k; j++) {
cnt += letterB[j];
}
if (i == 0) ans2 = cnt + k;
else ans2 = max(ans2, cnt + k);
}
}
printf("%d", max(ans1, ans2));
return 0;
}