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".
题意:给一个只含ab的字符串,可以改变不超过k个字母,使得这个字符串的的一个子串拥有最长相同的字母。
做法:就是一个裸的two pointers,第一次写的比较靠谱的写法(以前自己yy出来方法写着太麻烦了)
two pointers 就是一个左指针l一个右指针r,两个指针之间存在k个需要改变的k个a或者k个b,l代表除开这k个字母能到达左边最远,r代表除开这k个字母能到达右边最远+1。然后取最长的r-l就行了。不懂可以复制过去单步调试一下就懂了。
CODE
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
char s[N]; ///字符串
int a[N]; ///a标记为1,b标记为0
int main()
{
int n,k;
while(~scanf("%d %d %s",&n,&k,s+1))
{
for(int i = 1;i <= n;i++)
if(s[i] == 'a') a[i] = 1;
else a[i] = 0;
int ans = 0;
int tmp = 0; ///左右指针之间需要改变的字母的个数
for(int l = 1,r = 1;l <= n;l++) ///改变a
{
while(r <= n && tmp+a[r] <= k) tmp = tmp+a[r++];
ans = max(ans,r-l);
tmp -= a[l];
}
tmp = 0;
for(int l = 1,r = 1;l <= n;l++) ///改变b
{
while(r <= n && tmp+(!a[r]) <= k) tmp = tmp+(!a[r++]);
ans = max(ans,r-l);
tmp -= (!a[l]);
}
printf("%d",ans);
}
return 0;
}