codeforces 676C
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?
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".
题意:
给定一个只含字母a和b的字符串,你能够挑出<=k个字母来,让他变化成你想要的字母,问,在此变换下能够得到的最长的连续相同子串的长度是多少?
分析:
分两种情况,要连续a和连续b。
连续a 时,记录前面有多少个b字母,在这个上面进行尺取就行了。
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; char str[maxn]; int numb[maxn]; int numa[maxn]; int main() { //freopen("in.txt","r",stdin); int n,k; scanf("%d%d",&n,&k); scanf("%s",str+1); for(int i = 1; i <= n; i++) { if(str[i]=='b') numb[i] = numb[i-1] + 1; else numb[i] = numb[i-1]; if(str[i]=='a') numa[i] = numa[i-1] + 1; else numa[i] = numa[i-1]; } int L = 1; int R = 1; int ans = 0; int tmp = 0; int pos = 0; while(R<=n) { while(R<=n&&numb[R]-tmp<=k) { ans = max(ans,R-pos); R++; } pos++; tmp=numb[L]; L++; } L = 1;R = 1; tmp = 0; pos = 0; while(R<=n) { while(R<=n&&numa[R]-tmp<=k) { ans = max(ans,R-pos); R++; } pos++; tmp=numa[L]; L++; } printf("%d\n",ans); return 0; }