首页 > 代码库 > 哈希 poj 3274

哈希 poj 3274

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 }

 

哈希 poj 3274