HDU 4334 Trouble(哈希表)

题目链接

刷一下存在感。。。多校的题目,其实以前也知道哈希的的用法,一直不知道如何实现,今天咨询了一下宝哥,然后讲解了一下他的代码,有点像是邻接中的挂链的形式。

这个哈希 是运用对一个素数取模的办法,注意一下要先枚举两个数建立哈希,如果3个数,会超内存,效率目测也不好。静态的比动态申请内存稍快,这个题,建哈希不是最主要的矛盾。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #define M 177777
 6 #define ll __int64
 7 using namespace std;
 8 struct node
 9 {
10     ll data;
11     struct node *next;
12 } *head[M],key[60000];
13 ll p[6][201];
14 int main()
15 {
16     int i,j,k,t,n,z,num;
17     ll s,m;
18     scanf("%d",&t);
19     while(t--)
20     {
21         scanf("%d",&n);
22         num = 0;
23         memset(head,0,sizeof(head));
24         for(i = 1; i <= 5; i ++)
25         {
26             for(j = 1; j <= n; j ++)
27             {
28                 scanf("%I64d",&p[i][j]);
29             }
30         }
31         for(i = 1; i <= n; i ++)
32         {
33             for(j = 1; j <= n; j ++)
34             {
35                 node *q1 = &key[num ++];//静态申请的内存。
36                 m = p[1][i]+p[2][j];
37                 q1 -> data = m;
38                 m = m%M;
39                 if(m < 0)
40                     m += M;
41                 q1 -> next = head[m];
42                 head[m] = q1;
43             }
44         }
45         z = 0;
46         for(i = 1; i <= n&&!z; i ++)
47         {
48             for(j = 1; j <= n&&!z; j ++)
49             {
50                 for(k = 1; k <= n&&!z; k ++)
51                 {
52                     s = p[3][i]+p[4][j]+p[5][k];
53                     m = -s;
54                     m = m%M;
55                     if(m < 0)//防止出现负数
56                         m += M;
57                     node *q1;
58                     for(q1 = head[m]; q1 != NULL; q1 = q1->next)
59                     {
60                         if(q1 -> data == -s)
61                         {
62                             z = 1;
63                             break;
64                         }
65                     }
66                 }
67             }
68         }
69         if(z)
70             printf("Yes\n");
71         else
72             printf("No\n");
73     }
74     return 0;
75 }
posted @ 2012-09-11 21:44  Naix_x  阅读(289)  评论(0编辑  收藏  举报