您的位置:首页 > 其它

【HPUOJ 1415】小ho的0 【字符串】

2017-08-12 22:00 155 查看
题目描述

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

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

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

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

输入

第一行是一个数K。

第二行是一个字符串str。

0 < |str| ≤ 106

输出

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

样例输入

2

101010

样例输出

6

代码

#include<bits/stdc++.h>
using namespace std ;
typedef long long LL ;

const int MAXN = 1e6+100;
const int MAXM = 1e5 ;
const int mod  = 1e9+7 ;

char str[MAXN];
int pos[MAXN];
int num[MAXN]={0};

int main(){
int k;scanf("%d %s",&k,str+1);
int len=strlen(str+1);
int ans=0;
int size=0;int cnt=0;
for(int i=1;i<=len;i++){
if(str[i]=='0') { cnt++; num[i]=cnt; }
else { num[i]=cnt; cnt=0; }
if(str[i]=='1') pos[++size]=i;
}
if(k==0) {
for(int i=1;i<=size;i++){
ans+=(num[pos[i]]-1)*num[pos[i]]/2+num[pos[i]];
}
ans+=cnt+(cnt-1)*cnt/2;
printf("%d\n",ans);
return 0;
}
int i,j;
for(i=k;i<size;i++){
if(num[pos[i-k+1]])
ans+=num[pos[i-k+1]]*(num[pos[i+1]]+1)+1+(num[pos[i+1]]);
else if(num[pos[i+1]])
ans+=num[pos[i+1]]*(num[pos[i-k+1]]+1)+1+num[pos[i-k+1]];
else ans++;
}
if(num[pos[i-k+1]])
ans+=num[pos[i-k+1]]*(cnt+1)+1+cnt;
else if(cnt)
ans+=cnt*(num[pos[i-k+1]]+1)+1+num[pos[i-k+1]];
else ans++;

printf("%d\n",ans);
return  0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: