poj3274 哈希

  这题终于让我AC了,其过程之艰辛我不想再回忆了,看了各种代码,一定要注意指针空和非空的问题,再一个要注意边界。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <stdlib.h>
 5 #define mod 9967
 6 int gird[100000+100][32];
 7 int K;
 8 int cmp(int a,int b){
 9     int i;
10     for(i=0;i<K;++i){
11         if(gird[a][i]!=gird[b][i])
12             return 0;
13     }
14     return 1;
15 }
16 void change(int num,int cnt){
17     int CNT=0;
18     while(num){
19         gird[cnt][CNT++]=num%2;
20         num=num/2;
21     }
22     for(int i=0;i<K;++i)
23         gird[cnt][i]+=gird[cnt-1][i];
24     for(int i=1;i<K;++i){
25         gird[cnt][i]-=gird[cnt][0];
26     }
27     gird[cnt][0]=0;
28     return;
29 }
30 int sign[mod];
31 struct node{
32     node *next;
33     int pos;
34 }p[mod];
35 int main(){
36     int n,i,j;
37     int mmax;
38     int value;
39     int ttt;
40     while(~scanf("%d%d",&n,&K)){
41         memset(gird,0,sizeof(gird));
42         memset(sign,0,sizeof(sign));
43         node *tmp;
44         node *op;
45         for(i=0;i<mod;++i)
46             p[i].next=NULL;
47         mmax=0;
48         p[0].next=NULL;
49         p[0].pos=0;
50         sign[0]=1;
51         for(i=1;i<=n;++i){
52             scanf("%d",&ttt);
53             change(ttt,i);
54             value=0;
55             for(j=0;j<K;++j){
56                 value+= ( gird[i][j]*j );
57             }
58             value=int(fabs(value))%mod;
59             if(sign[value]==0){
60                 p[value].pos=i;
61                 sign[value]=1;
62                 continue;
63             }else if(sign[value]==1){
64                 tmp=(node *)malloc(sizeof(node));
65                 tmp->next=NULL;
66                 tmp->pos=i;
67                 int ss=0;
68                 op=&p[value];
69                 while(op!=NULL){
70                     if( cmp(op->pos,i)==1 ){
71                         ss=1;
72                         if( (i-op->pos) > mmax ){
73                            mmax=i- (op->pos);
74                            break;
75                         }
76                     }
77                     op=op->next;
78                 }
79                 if(ss==1) continue;
80                 op=&p[value];
81                 while(op->next!=NULL){
82                     op=op->next;
83                 }
84                 op->next=tmp;
85             }
86         }
87         printf("%d
",mmax);
88         /*
89         for(i=0;i<=n;++i){
90             for(j=0;j<K;++j){
91                 printf("%d ",gird[i][j]);
92             }
93             printf("
");
94         }
95         */
96 
97     }
98     return 0;
99 }
原文地址:https://www.cnblogs.com/symons1992/p/3486821.html