codeforces c-Vasya and String(二分+前缀和)

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 denotes beauty 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
Copy
4 2
abba
Output
Copy
4
Input
Copy
8 1
aabaabaa
Output
Copy
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".

题目大意:给你一个长度为n的字符串,你可以修改其中的k个字符,求你修改后字符串相同的最大长度 
解题思路:利用前缀和和二分搜索就可以解决这一题,这题让我知道了 strlen函数不能乱用在循环体内,可能会超时!
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<bits/stdc++.h>
#define mem0(a) memset(a, 0, sizeof(a));
#define mem1(a) memset(a, -1, sizeof(a));
using namespace std;
typedef long long LL;

int n, k, sum[100100];
char str[100100];

bool check(int x)
{
    //printf("%d\n", x);
    for(int i = 0; i+x <= n; i ++) {
        if(sum[i+x] - sum[i] >= x-k || sum[i+x] - sum[i] <= k) return true;
    }
    return false;
}

int main()
{
    while(~scanf("%d%d", &n, &k)) {
        scanf("%s", str);
        int len = strlen(str);
        sum[0] = 0;
        for(int i = 0; i < len; i ++) {
            if(str[i] == 'b') sum[i+1] = sum[i]+1; //前缀和
            else sum[i+1] = sum[i];
        }
        int l = 0, r = 100010;
        while(l+1 < r) { //二分搜索
            int mid = (l+r)/2;
            if(check(mid)) l = mid;
            else r = mid;
        }
        if(check(l+1)) printf("%d\n", l+1);
        else printf("%d\n", l);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/i_believe_cwj/article/details/80385885
今日推荐