您的位置:首页 > 其它

HDU 4334 Trouble(哈希表)

2012-09-11 21:44 489 查看
题目链接

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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define M 177777
#define ll __int64
using namespace std;
struct node
{
ll data;
struct node *next;
} *head[M],key[60000];
ll p[6][201];
int main()
{
int i,j,k,t,n,z,num;
ll s,m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
num = 0;
memset(head,0,sizeof(head));
for(i = 1; i <= 5; i ++)
{
for(j = 1; j <= n; j ++)
{
scanf("%I64d",&p[i][j]);
}
}
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= n; j ++)
{
node *q1 = &key[num ++];//静态申请的内存。
m = p[1][i]+p[2][j];
q1 -> data = m;
m = m%M;
if(m < 0)
m += M;
q1 -> next = head[m];
head[m] = q1;
}
}
z = 0;
for(i = 1; i <= n&&!z; i ++)
{
for(j = 1; j <= n&&!z; j ++)
{
for(k = 1; k <= n&&!z; k ++)
{
s = p[3][i]+p[4][j]+p[5][k];
m = -s;
m = m%M;
if(m < 0)//防止出现负数
m += M;
node *q1;
for(q1 = head[m]; q1 != NULL; q1 = q1->next)
{
if(q1 -> data == -s)
{
z = 1;
break;
}
}
}
}
}
if(z)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: