题目链接:http://codeforces.com/problemset/problem/676/C
题意:给一个只含有ab的字符串,最多修改k个字符使得一段连续字符串只包含一种字符的长度最长。
思路:尺取法,记录当前连续区间字符串中a的个数,b的个数和当前区间左右边界。现在右边界不断右移加上一个字符,如果min(a,b)小于等于k(也就是说可以通过修改来达到这个区间全部为一种字符)就更新答案;否则区间左边界一直向左移动,直到当前区间满足min(a,b)<=k。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;
#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)
#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod %100000007
const int maxn = 100009;
int n,k;
char s[maxn];
void solve()
{
int ans = 0;
int a,b;
a = b = 0;
int last = 0;
int len = strlen(s);
rep(i,0,len-1)
{
if ( s[i] == 'a' ) a++;
else b++;
if ( min(a,b) > k )
{
while( min(a,b) > k && last <= i )
{
if ( s[last] == 'a' ) a--;
else b--;
last++;
}
}
else
{
ans = max( ans , i-last+1 );
}
}
cout<<ans<<endl;
}
int main()
{
cin>>n>>k;
cin>>s;
solve();
return 0;
}