题意:给出一个01字符串S, f(S[l…r])为该子串的十进制值, 问S中有多少f(S[l…r]) == r-l+1
思路:因为数据最长不过2e5,2的二十次方,所以直接便利后二十位,就能得出答案,注意时间复杂度,如果便历每一位就要超时,所以我们只遍历s[l]==1的,记录一下前置零就可以了 .
//给出一个01字符串S, f(S[l…r])为该子串的十进制值, 问S中有多少f(S[l…r]) == r-l+1
//思路:因为数据最长不过2e5,2的二十次方,所以直接便利后二十位,就能得出答案
//注意时间复杂度,如果便历每一位就要超时,所以我们只遍历第一位是'1'的
//记录一下前置零就可以了
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
char s[200005];
scanf("%s",s);
int cnt=0;//结果
int sum0=0;//前置零
int n=strlen(s);
for(int i=0;i<n;i++){
if(s[i]=='0')sum0++;
else {
int num=0;
for(int j=i;j<=i+20&&j<n;j++){
num=num*2+(s[j]-'0');//相当于之前的num向左移动一位,再加新的一位的数
if(num<=j-i+1+sum0)cnt++;
else break;//如果大于了,往左移越来越大,更不可能满足
}
sum0=0;//记得清零
}
}
printf("%d\n",cnt);
}
}