zoukankan      html  css  js  c++  java
  • 1415: 小ho的01串 [字符串]

    点击打开链接

    1415: 小ho的01串 [字符串]


    题目描述

    有一个由01组成的字符串,它好长呀--------一望无际

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

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

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

    输入

    第一行是一个数K

    第二行是一个字符串str

    0 < |str| ≤ 106

    输出

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

    样例输入

    2
    101010
    

    样例输出

    6

    57
    1
    #include<iostream>
    2
    #include<cstdio>
    3
    #include<cstdlib>
    4
    #include<cstring>
    5
    #include<algorithm>
    6
    #include<queue>
    7
    #include<list>
    8
    #include<cmath>
    9
    #include<vector>
    10
    using namespace std;
    11
    const int maxn=1000010;
    12
    char str[maxn];
    13
    long long num[maxn];
    14
    int main()
    15
    {
    16
    //  freopen("in1.txt","r",stdin);   //查BUG
    17
    //  freopen("out1.txt","w",stdout);
    18
        long long ans=0,k,cnt=1;
    19
        scanf("%lld%s",&k,str);
    20
        long long l=1,r,len=strlen(str),temp=0;num[0]=-1;
    21
        if(k==0)
    22
        {
    23
            l=0;
    24
            for(long long i=0;i<len;++i)
    25
            {
    26
                if(str[i]=='1')
    27
                {
    28
                    r=i-l;l=i+1;
    29
                    ans=ans+r*(r+1)/2;
    30
                    //cout<<ans<<endl;
    31
                }
    32
            }
    33
            r=(len-l);
    34
            ans=ans+r*(r+1)/2;
    35
            cout<<ans<<endl;
    36
            return 0;
    37
        }
    38
        for(long long i=0;i<len;++i)
    39
        {
    40
            if(str[i]=='1')
    41
            {
    42
                temp++;num[cnt++]=i;
    43
            }
    44
            if(temp==k+1)
    45
            {
    46
                ans=ans+(num[l]-num[l-1])*(num[cnt-1]-num[cnt-2]);l++;temp--;
    47
                //cout<<num[l]-num[l-1]<<endl;
    48
            }
    49
        }
    50
        if(temp==k)
    51
        {
    52
            ans=ans+(num[l]-num[l-1])*(len-num[cnt-1]);
    53
        }
    54
        cout<<ans<<endl;
    55
        return 0;
    56
    }






    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    我来悟微服务(1)-夜观天象
    静夜思-十年总结与展望
    【Orleans开胃菜系列2】连接Connect源码简易分析
    【Orleans开胃菜系列1】不要被表象迷惑
    .Net单元测试业务实践
    未能使用“Csc”任务的输入参数初始化该任务
    面试发散思维
    Linux部署DotNetCore记录
    一步一步来熟悉Akka.Net(一)
    午夜杂谈
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7406495.html
Copyright © 2011-2022 走看看