https://codeforces.com/problemset/problem/1217/C
考虑到2^20>2e5
那么长度肯定不超过20了,所以直接枚举就行
为了避免重复,我们考虑枚举每一个二进制数的第一个1的位置,不管他左边有多少0。
每往右边移动一位,这个数字就会变大,左区间就会更左,因为我们枚举的是第一个1位置,所以左区间l必须大于上一个1的位置last,即l>last的时候,ans++
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,m;
int a[maxl];
char s[maxl];
long long ans;
inline void prework()
{
scanf("%s",s+1);
n=strlen(s+1);
}
inline void mainwork()
{
int last=0,x,l;ans=0;
for(int i=1;i<=n;i++)
if(s[i]=='1')
{
x=0;
for(int j=i;j<=n && j<=i+30;j++)
{
x=x*2+s[j]-'0';
l=j-x+1;
if(l<=last)
break;
ans++;
}
last=i;
}
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}