POJ2785 4 Values whose Sum is 0(哈希)

链接http://poj.org/problem?id=2785

继续上一篇的思路做的,结果。。。

第一次MAXN=1000007超时

第二次MAXN=10000007   Time 8063 Ms   Memory 164760 K  险过,=.=!

先附上代码,再寻求其他方法吧

 1 #include<cstdio>
 2 #include<cstring>
 3 #define mem(a) memset(a,0,sizeof(a))
 4 #define MAXN 10000007
 5 #define maxn 16000000
 6 int hash[MAXN+5],next[maxn+5];
 7 int sum[maxn+5],index;
 8 int a[4005],b[4005],c[4005],d[4005];
 9 void insert(int num)//插入一个数num
10 {
11     int numm=num>0?num:-num;
12     int h=(numm%MAXN+numm/MAXN)%MAXN;//哈希函数
13     sum[index]=num;
14     next[index]=hash[h];
15     hash[h]=index++;
16 }
17 int is_find(int num)
18 {
19     int count=0;
20     int numm=num>0?num:-num;
21     int h=(numm%MAXN+numm/MAXN)%MAXN;
22     int u=hash[h];
23     while(u){               //一条链要搜到尾,找到这个值的可行数
24         if(sum[u]==num)count++;
25         u=next[u];
26     }
27     return count;//返回可行数
28 }
29 int main()
30 {
31     int n;
32     while(~scanf("%d",&n))
33     {
34         mem(sum);index=1;
35         mem(hash);mem(next);
36         int i,j,count=0;
37         for(i=1;i<=n;i++)
38             scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
39         for(i=1;i<=n;i++)
40             for(j=1;j<=n;j++)
41                     insert(a[i]+b[j]);
42         for(i=1;i<=n;i++)
43             for(j=1;j<=n;j++)
44                     count+=is_find(-c[i]-d[j]);
45         printf("%d\n",count);
46     }
47     return 0;
48 }

 

posted @ 2013-04-24 17:25  再见~雨泉  阅读(1122)  评论(0编辑  收藏  举报