题意:给定一个01字符串,定义一个子串为好串,则该串满足串的长度等于串代表的十进制数,求出串的子串中好串的个数
思路:数据范围为2*10^5,故与长度相等的二进制数最多有18位,从头开始枚举,记录前导0个数,若某个数对应的长度不够,则可以由前导0来补,每次枚举到1时计算当前位置到末尾满足条件的子串个数,重置前导0个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3+5;
const int inf = 0x3f3f3f3f;
int T, n;
int main()
{
cin >> T;
string s;
for (int t = 0; t < T; t++) {
cin >> s;
n = s.length();
int ans = 0, pre = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '0') pre++;
else {
int r = i, cur = 1;
for (int j = 1; j <= 18; j++) {
if (cur <= pre+(r-i+1)) ans++;
if (r+1 >= n) break;
cur = cur*2 + (s[++r] - '0');
}
pre = 0;
}
}
cout << ans << "\n";
}
return 0;
}