zoukankan      html  css  js  c++  java
  • 1217C.The Number of Good Substrings(思维)

    您将得到一个二进制字符串s(回想一下,如果每个字符都是0或1,那么一个字符串就是二进制的)。

    设f(t)为整数t的十进制表示形式,写成二进制形式(可能包含前导零)。例如f (011) = 3, f (00101) = 5, f (00001) = 1, (10) = 2, f(000) = 0和f (000100) = 4。

    如果r - l+1=f(sl…sr),则子字符串sl,sl+1,…,sr是好的。

    例如,字符串s=1011有5个子串:s1…s1=1, s3…s3=1, s4…s4=1, s1…s2=10, s2…s4=011。

    你的任务是计算字符串s中好的子字符串的数量。

    题解:

    寻找值和长度相等的子串数量。

    做法是,实时统计前导0的数量,然后以每个数为起点实时生成二进制字符串,如果遇到长度比值小的,同时前导0的数量大于两者之差的,说明合法。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+100;
    string s;
    int main () {
        int T;
        scanf("%d",&T);
        while (T--) {
            cin>>s;
            int ans=0;
            int pre=0;
            for (int i=0;i<s.length();i++) {
                if (s[i]=='0')
                    pre++;
                else {
                    int r=i;
                    int cnt=1;
                    for (int j=0;j<18;j++) {
                        if (cnt<=pre+(r-i+1))
                            ans++;
                        if (r==s.length()-1) 
                            break;
                        cnt=cnt*2+(s[++r]-'0');
                    }
                    //往后延申,长度不够就用前导0 
                    pre=0;
                }
            }
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    拯救公主
    爱情之路
    无聊的会议
    对拍检验程序
    TCP三次握手
    OA系统走过的的坑之部门岗位管理
    蓝屏警告
    三级联动
    Ajax二级联动
    近期疑惑和总结
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12687500.html
Copyright © 2011-2022 走看看