Vasya and String CodeForces

来源:互联网 发布:人工智能语言 编辑:程序博客网 时间:2024/05/16 19:09

题目链接


题目大意: 给定一个只含a,b的字符串,可以将其中有限个数的a转化成b,b转化成a。

问获得的最大的连续的串的长度


Input
4 2abba
Output
4


Input
8 1aabaabaa
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 210010int 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 210010int 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;}