高校生Vasyaは、誕生日プレゼントとして、長さnの文字列を得ました。この文字列は、文字「a」と「b」のみで構成されています。Vasyaは等しい文字からなるストリング(連続的なサブシーケンス)の最大長さの文字列の美しさを示しています。
Vasyaは、元の文字列のこれ以上のkよりも文字を変更することができます。彼は達成することができ、文字列の最大の美しさとは何ですか?
入力
変化に文字列の長さと文字の最大数-入力の最初の行は二つの整数nとk(1≤N≤100 000、0≤K≤N)を含みます。
2行目は、文字「A」と「B」のみからなる文字列を含みます。
出力は
Vasyaは、k個の文字を超えない変更することで達成することができ、文字列の最大の美しさ-整数のみを印刷します。
例
入力
4 2
abba
出力
4
入力
8 1
aabaabaa
出力
5
問題はあなたの長さを与えることであるnおよびのみAB文字列が含まれ、および修正のk倍の機会が変更された文字列が同じ文字の連続した長さを含む最も長い文字列のサブ後に得られるように、存在することが、この手段。
タイトル解析:
まず、[]、B []配列番号とビット記憶にi番目のビットの数Bです。
そして、開始点としてこれ、すべてのポイントを列挙し、その後二分終わり、あなたはANSストレージを見つけるために使用できる最大の長さと振り返ります。
コードの場合:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iomanip>
#define LL long long
const int N=1e5+5;
using namespace std;
int a[N],b[N];
char s[N];
int main()
{
cin.tie(0); //解除cin和cout的绑定加快cin的速度
ios::sync_with_stdio(false); //再次加快cin的速度,但不能再用scanf了
int n,k;
cin>>n>>k;
cin>>s+1;
for(int i=1;i<=n;i++)
{ //a存储s的1-i中a的个数,b存储s的1-i中b的个数
if(s[i]=='a') a[i]=a[i-1]+1,b[i]=b[i-1];
else a[i]=a[i-1],b[i]=b[i-1]+1;
}
int ans=0;
for(int i=1;i<=n;i++)
{
int l=i,r=n,mid;
while(r>=l) //二分查找终点
{
mid=l+r>>1;
if(a[mid]-a[i-1]<=k||b[mid]-b[i-1]<=k)
{ //如果a或b的的数量小于等于k(即修改小于k次)
ans=max(ans,mid-i+1);//则满足条件用其长度与ans比较,求最大值
l=mid+1;
}
else r=mid-1;
}
}
cout<<ans<<endl; //输出答案
return 0;
}