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\n",ans);
    }
}

 

posted @ 2020-04-12 20:46  zlc0405  阅读(277)  评论(0编辑  收藏  举报