NYOJ 138 找球号(二)

 1 #include<stdio.h>
 2 #include<memory.h>
 3 #define N 1000010
 4 #define MOD 110023
 5 int ind,key[N],next[N],order[N];//key[i]保存第i个小球的编号,
 6                         //next[]保存当出现冲突时同一余数对应的多个编号的值 
 7                         //order[i]保存余数为i时对应的球的序号,进而找到其编号 
 8 void add(int n)
 9 {
10     int remainder;
11     remainder=n%MOD;
12     key[ind]=n;            
13     next[ind]=order[remainder]; 
14     order[remainder]=ind;
15     ind++;
16 }
17 int main()
18 {
19     int i,j,n,m,number,tmp;
20     char cmd[6];
21     memset(order,-1,sizeof(order));
22     scanf("%d",&n);
23     while(n--){
24         scanf("%s%d",cmd,&m);
25         if(*cmd=='A'){
26             for(i=0;i<m;i++){
27                 scanf("%d",&number);
28                 add(number);
29             }
30         }else{
31             for(i=0;i<m;i++){
32                 scanf("%d",&number);
33                 tmp=number%MOD;
34                 for(j=order[tmp];j!=-1;j=next[j])//j=1时说明哈希值为tmp的球都以找完 
35                     if(key[j]==number)
36                         break;
37                 puts(j+1?"YES":"NO");
38             }
39         }
40     }
41     return 0;
42 }

以前只知道哈希算法,但没有认真练习过,今天练习了一下,感觉哈希查找效率很高!

贴上最优代码:

 1  
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 using namespace std;
 6 
 7 unsigned int a[3125010] = {0} ;
 8 
 9 int main()
10 {
11     int n , m , x ;
12     int i ;
13     char op[10] ;
14     scanf("%d", &n ) ;
15     while( n-- > 0 )
16     {
17         fflush( stdin ) ;
18         memset( op , 0 , sizeof(op) );
19         scanf("%s", op ) ;
20         if( strcmp( op , "ADD" ) == 0 )
21         {
22             scanf("%d", &m ) ;
23             for( i = 0 ; i < m ; i++ )
24             {
25                 scanf("%d", &x ) ;
26 
27                 a[x/32] |= 1 << ( x % 32 ) ;
28             }
29         }
30         else
31         {
32             scanf("%d", &m ) ;
33             for( i = 0 ; i < m ; i++ )
34             {
35                 scanf("%d", &x ) ;
36 
37                 if( ( a[x/32] & ( 1 << ( x % 32 ))) )
38                 {
39                     printf("YES\n") ;
40                 }
41                 else
42                     printf("NO\n") ;
43             }
44         }
45     }
46     return 0 ;
47 }        

 

posted on 2013-03-21 15:58  小花熊  阅读(214)  评论(0编辑  收藏  举报

导航