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);
        }
    }
  • 相关阅读:
    CSS3旋转动画
    CSS3的动画属性
    CSS选择器
    JS事件委托
    js 轮播图效果
    JS事件冒泡和事件捕获
    JS自定义播放器
    js闭包for循环只执行最后一个值得解决方法
    交通红绿灯
    汉明距
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12687500.html
Copyright © 2011-2022 走看看