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
", ans);
  }
  return 0;
}

原文地址:https://www.cnblogs.com/Vty66CCFF/p/12326683.html