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".
题意:
给出一个长度为n的字符串,只有字符'a'和'b'。最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'。
问改变后的最长连续相同字符的字串长度为多少。
话说开始我想dp来着,但是数据太大。。。后来看到别人写的题解才恍然大悟
思路:用两个指针,i=j=1,保持它们之间的a个数是k,算出最大值,初始化(i,j)然后保持它们之间b个数是k,算出最大值。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #include<vector> #include<stack> #include<set> #include<map> #include<queue> #include<algorithm> using namespace std; char c[100005]; int pa[100005],pb[100005]; int main(){ int n,k; int i,j; scanf("%d %d",&n,&k); int left,right; getchar(); for(i=1;i<=n;i++){ scanf("%c",&c[i]); if(c[i]=='a') pa[i]=pa[i-1]+1; else pa[i]=pa[i-1]; if(c[i]=='b') pb[i]=pb[i-1]+1; else pb[i]=pb[i-1]; } left=1; right=1; int ans=0; while(right<=n){ while(pa[right]-pa[left-1]<=k&&right<=n){ right++; } ans=max(ans,right-left); left++; } left=right=1; while(right<=n){ while(pb[right]-pb[left-1]<=k&&right<=n){ right++; } ans=max(ans,right-left); left++; } printf("%d\n",ans); return 0; }