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;
}
posted @ 2017-08-11 20:36  南风古  阅读(123)  评论(0编辑  收藏  举报