您的位置:首页 > 其它

codeforces 676C Vasya and String 前缀数组+二分查找

2016-05-28 10:22 471 查看
C. Vasya and String

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

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?

Input

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.

Output

Print the only integer — the maximum beauty of the string Vasya can achieve by changing no more than k characters.

Examples

input
4 2
abba


output
4


input
8 1
aabaabaa


output
5


Note

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".

首先用一个整形数组a和b分别存放字符串s的前缀,使得a[i] - a[j - 1]为[i, j]区间上'a'的个数(仅仅是个数,不一定连续,b同理)

然后就查找能用至多k个元素填充使连续串最长的区间[i,l]

扫描字符串中的每个位置i,计算k有能力填充的以i为起点的最长的区间[i,l]的长度

如果对于每个位置i,在找区间[i,l]时用for循环遍历的话肯定会超时,采用二分查找将复杂度降到nlog(n)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn = 100000;
char s[maxn + 10];
int a[maxn + 1], b[maxn + 10];

int n, k;

bool check(int l, int r) {
if (a[r] - a[l - 1] <= k || b[r] - b[l - 1] <= k) {
return true;
}
return false;
}

int main()
{
cin >> n >> k;
scanf("%s", s + 1);
for (int i = 1; i <= n; i++) {
a[i] = a[i - 1] + (s[i] == 'a');
b[i] = b[i - 1] + (s[i] == 'b');
}
int ans = -1;
for (int i = 1; i <= n; i++) {
int l = i, r = n;
while (l <= r) {
int mid = (l + r) >> 1;
check(i, mid) ? l = mid + 1 : r = mid - 1;
}
ans = max(ans, r - i + 1);
}
cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息