• 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;
    }
    
  • 相关阅读:
    部署NetCore项目(本文介绍用用IIS部署)
    vs中添加MySql实体集流程
    一文搞定HashMap的实现原理
    二分查找
    hashcode返回值可能为负数
    哈希碰撞与生日攻击
    并发的第二天
    java并发编程-1
    排序的第一天
    并发的第一天
  • 原文地址:https://www.cnblogs.com/nanfenggu/p/7900066.html
Copyright © 2020-2023  润新知