这题终于让我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 }