您的位置:首页 > 其它

zzuli 1895 (985的0-1串难题)

2016-08-09 19:49 519 查看
985的0-1串难题

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: