思路
类似朴素的尺取法,分别将序列以a,b来算。
以选a来说,我们对每个b赋值1代表需要1的代价去获得1的价值,对a则代价为0,这样问题转化为一道朴素简单的尺取法。(在付出最大代价k时可获得最长的序列数量即使答案).然后对b进行同样操作,取两次操作的最大值即是答案。
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int cnt=0,n,k;
string ss;
cin>>n>>k>>ss;
int ans=0;
int s=1,w=0,sum=0;
a[1]=ss[0]=='a'?1:0;//对初始代价赋值
for(int i=1;i<n;i++){
a[i+1]=(ss[i]=='a'?1:0);//预处理代价
}
for(int i=1;i<=n;i++){//朴素尺取法
sum++;w+=a[i];
while(s<=i&&w>k){//代价w,最大可付出代价k
sum--;w-=a[s++];
}
ans=max(ans,sum);
}
a[1]=ss[0]=='b'?1:0;//同上
for(int i=1;i<n;i++){
a[i+1]=(ss[i]=='b'?1:0);
}
s=1,sum=0,w=0;
for(int i=1;i<=n;i++){
sum++;w+=a[i];
while(s<=i&&w>k){
sum--;w-=a[s++];
}
ans=max(ans,sum);
}
cout<<ans<<endl;
return 0;
}