刷一下存在感。。。多校的题目,其实以前也知道哈希的的用法,一直不知道如何实现,今天咨询了一下宝哥,然后讲解了一下他的代码,有点像是邻接中的挂链的形式。
这个哈希 是运用对一个素数取模的办法,注意一下要先枚举两个数建立哈希,如果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 }