链接:https://ac.nowcoder.com/acm/contest/893/F
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
你有一个长度为 n 的 01 串S,你可以执行最多 m 次操作。
对于每次操作,你可以选择一个位置 i 满足 1 \le i \le n1≤i≤n,翻转这一位的值,0变成1,1变成0。
定义一个 01 串的价值为其中最长连续0的个数和最长连续1的个数的较大值,求S在经过最多m次操作后的最大价值。
输入描述:
- 第一行一个整数 T ,表示接下来有 T 个样例。
- 首先输入n,m,表示S串的长度n和操作次数m,其中1 \le n \le 1000001≤n≤100000,0 \le m \le 10000≤m≤1000;
- 接下来输入一个长度为n的字符串S。
输出描述:
一个整数,表示题面上描述的最大价值。
示例1
输入
复制
2
5 1
00101
2 1
01
输出
复制
4
2
说明
第一个串翻转第三个位置,00001的价值为4;第二个串翻转第一个位置,11的价值为2。
#include <bits/stdc++.h>
using namespace std;
int n,m;
string s;
int solve(char c)
{
int cnt = 0,ans = 0,L = 0;
for(int i = 0; i < n; i++)
{
if(s[i] == c) cnt++;//要修改的个数
if(cnt > m) ans = max(ans,i-L);
while(cnt > m)//要修改的个数大于m,L要右移
{
cnt -= (s[L++] ==c);
}
ans = max(ans,i-L+1);
}
s.clear();
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
cin>>s;
int res = max(solve('0'),solve('1'));
cout<<res<<endl;
}
return 0;
}