这题容易想到用dp去做,如果对移位运算符熟悉的话就不是很难去实现,我也是这么想的,没想到跟它耗了将近两个小时,WA了十几发,差点就砸电脑了,思路完全没问题的,看了好多博客,思路都跟我不一样,我跟它杠上了。最后找到哪里有问题了,真是细节啊!在进行移位的时候,比如:1<<k 时,因为k是小于60的,你就算是long long x = 1<<k; 它也会爆,因为前面的1默认是int !!!细节,无话可说。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long dp[1000010];
int main(){
int t, Case = 1;
scanf("%d", &t);
while(t--){
dp[0] = 0;
long long k, maxn = 0;
int ch;
scanf("%d", &k);
long long temp = (1LL<<k) - 1; //其2进制有k个1
getchar();
for(long long i = 1;; i++){
ch = getchar();
if(ch != '1' && ch != '0') break;
else dp[i] = (ch - '0' + ((dp[i-1] * 2) & temp)) & temp;//第一个 & 为了把长度超过k的部分 与 掉(0 & 1 = 0) 第二个是防止有0,影响结果
if(dp[i] > maxn) maxn = dp[i];
}
printf("Case #%d: %lld\n",Case++,maxn);
}
return 0;
}