Codeforces 1217C
思路是统计前导零,每次遇到 1,暴力向后搜 18 位,(1<<18)一定包括了所有情况。
转换成 10 进制后,如果大于 r-l, 小于 r-l+前导零数,那么就增加一种情况。
重点是这里我有个在 for 循环上的问题。
for (int i=1; i<3, i<5; i++) {
printf("%d ", i);
}
输出结果:1 2 3 4
for (int i=1; i<5, i<3; i++) {
printf("%d ", i);
}
输出结果:1 2
for (int i=1; i<3 && i<5; i++) {
printf("%d ", i);
}
输出结果:1 2
因而可以看出,for 循环在判断相同变量真假时,会采取后面的一种。
如果同一变量判断多次,还是要加上 && 或 ||。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, zero, sum, ans;
char ch;
int main()
{
scanf("%d", &n);
ch=getchar();
for (int i=1; i<=n; i++) {
string s;
ch=getchar();
while (ch=='0' || ch=='1') {
s+=ch;
ch=getchar();
}
ans=0, zero=0, sum=0;
for (int j=0; j<s.size(); j++) {
if (s[j]=='0') {zero++;}
else {
for (int k=j; k<s.size() && k<j+19; k++) {
sum=sum*2+s[k]-'0';
if (sum>=k-j+1 && sum<=k-j+1+zero) {ans++;}
}
zero=0, sum=0;
}
}
printf("%d\n", ans);
}
return 0;
}