题目链接:https://codeforces.com/contest/1217/problem/C
思路:从题中可以看出,选定一个为‘1’的数字作为起点,当数字段长度超过2,数字段的值一定大于长度,此时需要看‘1’旁边出现了几个‘0’,这些’0’可以在数字段的值不变的情况下增长长度。所以对于每一个‘1’,遍历一遍它有可能符合题意的情况,当数字段的值大于它的最大延长长度时停止。
对与每个’1’最多向后遍历20多位(因为长度最大是2e5),不会超时。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> t;
while(t--) {
string s;
cin >> s;
int cnt = 0 , ans = 0;
for(int i = 0 ; i < s.length() ; i++) {
if(s[i] == '0')cnt++;
else {
int num = 0 , len = 0;
while(i + len < s.length()) {
num = num * 2 + s[i + len] - '0';
len++;
if(num > len + cnt)break;
ans++;
}
cnt = 0;
}
}
cout << ans << "\n";
}
return 0;
}