C - The Number Of Good Substrings CodeForces - 1217C


#include <bits/stdc++.h> using namespace std; typedef long long ll; /* 给你一个字符串只有0和1,问你有多少个子串满足长度等于该子串的二进数值 开始我不知道如何暴力,后来想直接借助前面求得二进制值来往下求 但是还是不可以,tle 现在的思路是,直接找1的位置,然后求他左边有多少前导0,以此1往后延伸,不够就用前导0,因为要枚举所有1 所以不会有遗漏,而且从1开始的吗所以最多往后延伸18位1<<18大于它的长度了 */ const int maxn=2e5+10; int dis=18; char s[maxn]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); int sum=0; int len=strlen(s); int pre=0; for(int i=0; i<len; i++) { if(s[i]=='0') pre++; else { int r=i; int cnt=1; for(int j=0; j<dis; j++) { if(cnt<=pre+(r-i+1)) sum++; if(r==len-1) break; cnt=cnt*2+(s[++r]-'0'); } pre=0; } } printf("%d\n",sum); } return 0; }

猜你喜欢

转载自www.cnblogs.com/zhangzhenjun/p/11616332.html