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 }