题目描述
有一个由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;
}