您的位置:首页 > 其它

HPUOJ 小ho的01串

2017-08-13 21:04 267 查看

1415: 小ho的01串 [字符串]

时间限制: 1 Sec 内存限制: 128 MB

提交: 261 解决: 127 

题目描述

有一个由
0
1
组成的字符串,它好长呀--------一望无际

恩,说正题,小ho的数学不太好,虽然是学计算机的但是看见
0
1
也是很头疼的,

现在他的老师想让他计算出来包含
K
1
的子串有多少个-----呀,头要炸了!!!

小ho知道你的数学棒棒哒,所以来找你帮忙了。

输入

第一行是一个数
K


第二行是一个字符串
str


0 < |str| ≤ 106


输出

一个数
S
,代表了满足条件的个数。

样例输入

2
101010

样例输出

6

来源

思路:

暴力求解

每次统计出第一个1前面0的个数num,并将总循环移到第一个1处,不然后面会重复计算。然后小循环查到第n个1的位置并退出小循环,从那个位置开始,先总和加上(num+1),因为每个0都会与那n和1整体构成一个组合。然后求第n个1后面连续0的个数,每查到一个0总和加(num+1), 原因同上。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int main(){
int n;
string s;
scanf("%d",&n);
cin>>s;
long long sum=0;

for(int i=0;i<s.size();i++){
int f=0;//记录是否满足条件
int num=0;//记录第一个1前面0的个数
int k=0;//记录第几个1

while(s[i]=='0' && i<s.size()){
num++;
i++;
}

if(s[i]=='1'){
for(int j=i; j<s.size(); j++){
if(s[j]=='1')k++;
if(k==n){
f=1;
k=j+1;//记录仅临第n个1的0的位置
break;
}
}
}
if( f ){
sum += (num+1);
while(s[k]=='0' && k<s.size()){
sum += (num+1);
k++;
}
}else
break;
}
printf("%lld\n",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 规律 ACM