这题的关键点是字符串的长度不超过2e5
所以对于一个“好”的字符串,抛出去它的前导0,它的长度不会超过17 (log(2e5))
然后直接考虑枚举左端点,统计右端点有多少个符合题意的
在这之前要先预处理 nxt 数组,nxt[i] 表示在 i ~ n 中从左往右数第一次出现‘1’的位置
这样对于一个左端点 i ,就令j = nxt[i],向右暴力枚举并计算当前字符串的数值判断即可,一旦数值超过2e5就break
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define db double
#define rep(x,a,b) for(int x=(a);x<=(b);x++)
#define per(x,a,b) for(int x=(a);x>=(b);x--)
#define reP(x,a,b) for(int x=(a);x<(b);x++)
#define Per(x,a,b) for(int x=(a);x>(b);x--)
#define scf(a) scanf("%d",&a)
#define scfll(a) scanf("%lld",&a)
#define scfdb(a) scanf("%lf",&a)
#define ptf(a) printf("%d",a)
#define ptfll(a) printf("%lld",a)
#define ptfdb(x,a) printf("%.xlf",a)
#define ptfsp(a) printf("%d ",a)
#define ptfllsp(a) printf("%lld ",a)
#define ptfdbsp(x,a) printf("%.xlf ",a)
#define pli(a,b) make_pair(a,b)
#define pb push_back
#define el puts("")
#define FS first
#define SE second
#define PI acos(-1)
/*ios::sync_with_stdio(false);
freopen("in.txt","r",stdin);
freopen("1.out","w",stdout);*/
using namespace std;
const ll mod=998244353;
const int maxn=2e5+5;
char s[maxn];
int nxt[maxn];
int main(){
int T;scf(T);
while(T--){
scanf("%s",s+1);
int n=strlen(s+1);
s[n+1]='1';
per(i,n+1,1){
if(s[i]=='1') nxt[i]=i;
else nxt[i]=nxt[i+1];
}
int ans=0;
rep(i,1,n){
int sum=1;
int j=nxt[i];
while(j<=n){
if(sum==j-i+1) ans++;
sum=(sum<<1)+s[j+1]-'0';
j++;
if(sum>2e5) break;
}
}
ptf(ans);el;
}
}