HPU 1415 小ho的01串 (字符串)
1415: 小ho的01串 [字符串]
题目链接
时间限制: 1 Sec 内存限制: 128 MB
河南省多校连萌(三)
题目描述
有一个由0和1组成的字符串,它好长呀——–一望无际
恩,说正题,小ho的数学不太好,虽然是学计算机的但是看见0和1也是很头疼的,
现在他的老师想让他计算出来包含K个1的子串有多少个—–呀,头要炸了!!!
小ho知道你的数学棒棒哒,所以来找你帮忙了。
输入
第一行是一个数K。
第二行是一个字符串str。
0 < |str| ≤ 106
输出
一个数S,代表了满足条件的个数。
样例输入
2
101010
样例输出
6
枚举子串中第一个1的位置x,然后找到它后面的第k个1的位置y
对于这个情况子串就有n*m个(n为x前面连续0的个数+1,m为y后面连续0的个数+1)
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long int num[1000010];
char ch[1000010];
int main()
{
long long int sum=0,k,l=1,r;
num[0]=-1;
scanf("%lld%s",&k,ch);
long long int len=strlen(ch);
if(k==0)
{
for(long long int i=0;i<len;i++)
{
if(ch[i]=='1')
l=i+1,r=i-1,sum=sum+r*(r+1)/2;
}
r=len-l;
sum=sum+r*(r+1)/2;
}
else
{
long long int t=0,nu=1,st=1;
for(long long int i=0;i<len;i++)
{
if(ch[i]=='1')
t++,num[nu++]=i;
if(t==k+1)
sum+=(num[st]-num[st-1])*(num[nu-1]-num[nu-2]),st++,t--;
}
if(t==k)
sum+=(num[st]-num[st-1])*(len-num[nu-1]);
}
cout<<sum<<endl;
return 0;
}