题目大意: 给定一个只含a,b的字符串,可以将其中有限个数的a转化成b,b转化成a。
问获得的最大的连续的串的长度
Input
4 2 abba
Output
4
Input
8 1 aabaabaa
Output
5
code 1 尺取法:
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define ms(x) memset(x, 0, sizeof(x))
using namespace std;
typedef long long LL;
#define inf 10000000
#define N 210010
int n, k;
char s[N];
int ruller(char x)
{
int ans = 0;
int r=0, l=0, cnt = 0;
while(l<n && r<n)
{
while((s[r]==x||cnt<k)&&r<n)
{
if(s[r]!=x) cnt++;
r++;
}
ans = max(ans, r-l);
while(s[l]==x&&l<=r)
l++;
l++;
cnt--;
}
return ans;
}
int main ()
{
cin>>n>>k;
scanf("%s",s);
int a1 = ruller('a');
int a2= ruller('b');
int ans = max(a1, a2);
cout<<ans<<endl;
return 0;
}
code 2 二分查找:
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define ms(x) memset(x, 0, sizeof(x))
using namespace std;
typedef long long LL;
#define inf 10000000
#define N 210010
int n, k;
char s[N];
int sum[N];
int bina(char x)
{
ms(sum);
for(int i=1;i<=n;i++)
{
sum[i] = sum[i-1];
if(s[i] == x) sum[i]++;
}
int ans = 0;
for(int i=0;i<=n;i++)
{
int l=i, r=n;
while(l<=r)
{
int mid = (l+r)>>1;
if(sum[mid] - sum[i] <=k)
l = mid+1;
else r = mid-1;
}
ans = max(ans, r-i);
}
return ans;
}
int main ()
{
cin>>n>>k;
scanf("%s",s+1);
int a1 = bina('a');
int a2= bina('b');
int ans = max(a1, a2);
cout<<ans<<endl;
return 0;
}