您的位置:首页 > 其它

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

2017-08-12 23:10 393 查看
点击打开链接


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


题目描述

有一个由
0
1
组成的字符串,它好长呀--------一望无际
恩,说正题,小ho的数学不太好,虽然是学计算机的但是看见
0
1
也是很头疼的,
现在他的老师想让他计算出来包含
K
1
的子串有多少个-----呀,头要炸了!!!
小ho知道你的数学棒棒哒,所以来找你帮忙了。


输入

第一行是一个数
K

第二行是一个字符串
str

0 < |str| ≤ 106



输出

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


样例输入

2
101010


样例输出

6






1

#include<iostream>


2

#include<cstdio>


3

#include<cstdlib>


4

#include<cstring>


5

#include<algorithm>


6

#include<queue>


7

#include<list>


8

#include<cmath>


9

#include<vector>


10

using namespace std;


11

const int maxn=1000010;


12

char str[maxn];


13

long long num[maxn];


14

int main()


15

{


16

//  freopen("in1.txt","r",stdin);   //查BUG


17

//  freopen("out1.txt","w",stdout);


18

long long ans=0,k,cnt=1;


19

scanf("%lld%s",&k,str);


20

long long l=1,r,len=strlen(str),temp=0;num[0]=-1;


21

if(k==0)


22

{


23

l=0;


24

for(long long i=0;i<len;++i)


25

{


26

if(str[i]=='1')


27

{


28

r=i-l;l=i+1;


29

ans=ans+r*(r+1)/2;


30

//cout<<ans<<endl;


31

}


32

}


33

r=(len-l);


34

ans=ans+r*(r+1)/2;


35

cout<<ans<<endl;


36

return 0;


37

}


38

for(long long i=0;i<len;++i)


39

{


40

if(str[i]=='1')


41

{


42

temp++;num[cnt++]=i;


43

}


44

if(temp==k+1)


45

{


46

ans=ans+(num[l]-num[l-1])*(num[cnt-1]-num[cnt-2]);l++;temp--;


47

//cout<<num[l]-num[l-1]<<endl;


48

}


49

}


50

if(temp==k)


51

{


52

ans=ans+(num[l]-num[l-1])*(len-num[cnt-1]);


53

}


54

cout<<ans<<endl;


55

return 0;


56

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