题目大意
给出一个长度为
n
n
n的只含a
,b
的字符串,
再给出一个参数
k
k
k,可以修改字符串中的
k
k
k个字母。
问最长连续相同的字串为多少。
时间限制
1s
数据范围
n ≤ 1 0 5 n\le10^5 n≤105
题解
用贪心,只要能修改,就尽量修改。
先假设求的相同串全部是a
,
枚举字串右端点,不难发现左端点是单调递增的,所以可以用一个指针维护,因此时间复杂度就可以做到
O
(
n
)
O(n)
O(n)。
如果右端点是b
则看看是否还有剩余的修改次数,如果没有,就将左端点右移,直到其腾出一个修改次数为止。
Code
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#define G getchar
#define ll long long
using namespace std;
int read()
{
char ch;
for(ch = G();(ch < '0' || ch > '9') && ch != '-';ch = G());
int n = 0 , w;
if (ch == '-')
{
w = -1;
ch = G();
} else w = 1;
for(;'0' <= ch && ch <= '9';ch = G())n = (n<<1)+(n<<3)+ch-48;
return n * w;
}
const int N =100005;
int n , k , lst , m , ans;
char ch , a[N];
int work()
{
int s = 1 , mx = 1;
for (int i = 2 ; i <= n; i++)
{
if (a[i] != a[i - 1]) s = 1; else s++;
mx = max(mx , s);
}
return mx;
}
int main()
{
//freopen("b.in","r",stdin);
//freopen("b.out","w",stdout);
n = read();
k = read();
for (ch = G() ; ch !='a' && ch !='b' ; ch = G());
for (int i = 1 ; i <= n; i++)
{
a[i] = ch;
ch = G();
}
if (k == 0)
{
printf("%d\n", work());
return 0;
}
m = 0;
lst = 1;
for (int i = 1 ; i <= n ; i++)
{
if (a[i] == 'b')
{
for ( ; m == k ; )
{
if (a[lst] == 'b') m--;
lst++;
}
m++;
}
ans = max (ans , i - lst + 1);
}
m = 0;
lst = 1;
for (int i = 1 ; i <= n ; i++)
{
if (a[i] == 'a')
{
for ( ; m == k ; )
{
if (a[lst] == 'a') m--;
lst++;
}
m++;
}
ans = max (ans , i - lst + 1);
}
printf("%d\n", ans);
return 0;
}