1217C.The Number of Good Substrings(思维)
您将得到一个二进制字符串s(回想一下,如果每个字符都是0或1,那么一个字符串就是二进制的)。
设f(t)为整数t的十进制表示形式,写成二进制形式(可能包含前导零)。例如f (011) = 3, f (00101) = 5, f (00001) = 1, (10) = 2, f(000) = 0和f (000100) = 4。
如果r - l+1=f(sl…sr),则子字符串sl,sl+1,…,sr是好的。
例如,字符串s=1011有5个子串:s1…s1=1, s3…s3=1, s4…s4=1, s1…s2=10, s2…s4=011。
你的任务是计算字符串s中好的子字符串的数量。
题解:
寻找值和长度相等的子串数量。
做法是,实时统计前导0的数量,然后以每个数为起点实时生成二进制字符串,如果遇到长度比值小的,同时前导0的数量大于两者之差的,说明合法。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+100; string s; int main () { int T; scanf("%d",&T); while (T--) { cin>>s; int ans=0; int pre=0; for (int i=0;i<s.length();i++) { if (s[i]=='0') pre++; else { int r=i; int cnt=1; for (int j=0;j<18;j++) { if (cnt<=pre+(r-i+1)) ans++; if (r==s.length()-1) break; cnt=cnt*2+(s[++r]-'0'); } //往后延申,长度不够就用前导0 pre=0; } } printf("%d\n",ans); } }