Codeforces Round #354 (Div. 2) C Vasya and String
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".
思路:
- 当k大于 “a”的个数,并大于“b”的个数时,为n
- 当k=0时 为‘a’,'b'个数中教大的;
- 其他情况:统计连续‘a’,连续“b”的个数存在两个数组中(连续为a时,连续b的个数为0,其他情况类似);分别求出两个数组中连续k+1个数相加的最大值;其中较大的一个即答案
代码:
#include<stdio.h>
#include<string.h>
char str[100005];
int num[100005];
int num2[100005];
int main()
{
int n,k;
while(~scanf("%d %d",&n,&k))
{
getchar();
int cont=0;
int cont2=0;
int maxa=0;
int maxb=0;
int l=0;
int cont4=0;
int g=0;
for(int i=0;i<n;i++)
{
scanf("%c",&str[i]);
if(str[i]=='a')
cont++;
if(str[i]=='a')
cont2++;
else if(str[i]=='b')
{
if(maxa<cont2)
maxa=cont2;
num[l++]=cont2;
cont2=0;
}
if(str[i]=='b')
cont4++;
else if(str[i]=='a')
{
if(maxb<cont4)
maxb=cont4;
num2[g++]=cont4;
cont4=0;
}
}
if(maxa<cont2)
maxa=cont2;
num[l++]=cont2;
if(maxb<cont4)
maxb=cont4;
num2[g++]=cont4;
if(k>=cont||k>=(strlen(str)-cont))
{
printf("%d\n",n);
}
else
{
if(k==0)
{
printf("%d\n",(maxa>maxb? maxa:maxb));
}
else
{
int max1=0;
int max2=0;
for(int i=0;i<l-k;i++)
{
int cont3=num[i];
for(int j=1;j<=k;j++)
{
cont3+=num[i+j];
cont3++;
}
if(max1<cont3)
max1=cont3;
}
for(int i=0;i<g-k;i++)
{
int cont3=num2[i];
for(int j=1;j<=k;j++)
{
cont3+=num2[i+j];
cont3++;
}
if(max2<cont3)
max2=cont3;
}
printf("%d\n",max1>max2? max1:max2);
}
}
}
return 0;
}