Description
985有一个长度为n的0-1串,已知他最多可以修改k次(每次修改一个字符即0->1 或者 1->0),他想知道连续的全1子串最长是多少。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入两个整数n,k分别代笔上面的信息。
注:1 <= t <= 12,1 <= n <= 100000,0 <= k <= 100000。
Output
一个整数代表可以得到的最大长度。
Sample Input
2
6 3
010100
6 2
010100
Sample Output
5
4
题解:就是求k个0之间的最大串长度。
思路:用cnt[ ]记录0的个数和位置,cnt首尾加上0,cnt[0]=0,cnt[ ]=n+1.判断时先比较k与0总数的大小。
<span style="font-size:18px;">#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int t,n,k,i;
char s[101010];
int cnt[101010];
scanf ("%d",&t);
while (t--){
scanf ("%d %d",&n,&k);
/* getchar();
gets(s);gets()不能随便用,RE,因为gets()可以无限读取,不会判断上限,需要足够大的buffer
*/
scanf ("%s",s);
int pos=0;
cnt[pos++]=0;//首位加0
for (i=0;i<n;i++){
if (s[i]=='0'){
cnt[pos++]=i+1;//pos为0的位置,i+1为0的个数
}
}
cnt[pos++]=n+1;//末位设为0
if (k>=(pos-2))
printf ("%d\n",n);
else{
int num=0;
for (i=k+1;i<pos;i++){
num=max(num,cnt[i]-cnt[i-k-1]-1);
}
printf ("%d\n",num);
}
}
return 0;
} </span>