zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Python装饰器的解包装(unwrap)
    《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
    关于Python的函数(Method)与方法(Function)
    判断python对象是否可调用的三种方式及其区别
    tornado返回指定的http code
    Mac下安装pymssql
    iptables
    OpenFlow通信流程解读
    Prometheus的架构及持久化
    ansible总结
  • 原文地址:https://www.cnblogs.com/symons1992/p/3486821.html
Copyright © 2011-2022 走看看