n个牛 二进制最多k位
给你n个数
求max(j-i)&&对应二进制位的和相同
7 1 1 1 倒的
6 0 1 1
7 1 1 1
2 0 1 0
1 1 0 0
4 0 0 1
2 0 1 0
3 4 5 6 加起来一样
前缀和 - 第一列
然后就发现对应相等就是和相同
根据 和 hash
和 有小于0的
下标注意一下
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 #include<vector> 6 7 using namespace std; 8 9 #define MAXN 100010 10 #define mod 14997 11 12 int n,k; 13 int x[MAXN][32]; 14 vector<int>hash[15010]; 15 16 int main() 17 { 18 scanf("%d%d",&n,&k); 19 int ans=0; 20 21 for(int i=1;i<=n;i++) 22 { 23 int a,j,ii; 24 scanf("%d",&a); 25 j=1; 26 while(a) 27 { 28 x[i][j++]=a%2; 29 a=a/2; 30 } 31 for(ii=1;ii<=k;ii++) 32 x[i][ii]+=x[i-1][ii]; 33 for(ii=1;ii<k;ii++) 34 if(x[i][ii]!=x[i][ii+1]) 35 break; 36 if(ii==k) 37 ans=i; 38 } 39 40 for(int i=1;i<=n;i++) 41 { 42 int sum=0,ii; 43 for(int j=2;j<=k;j++) 44 { 45 x[i][j]-=x[i][1]; 46 sum=sum+x[i][j]; 47 } 48 x[i][1]=0; 49 sum=abs(sum)%mod; 50 for(int j=0;j<hash[sum].size();j++) 51 { 52 for(ii=1;ii<=k;ii++) 53 if(x[hash[sum][j]][ii]!=x[i][ii]) 54 break; 55 if(ii==k+1&&i-hash[sum][j]>ans) 56 ans=i-hash[sum][j]; 57 } 58 hash[sum].push_back(i); 59 } 60 printf("%d\n",ans); 61 return 0; 62 }
原文:http://www.cnblogs.com/cherryMJY/p/6098407.html