NYOJ-138 找球号2【Hash】

来源:互联网 发布:网络教育在职教育 编辑:程序博客网 时间:2024/06/05 20:46

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=138

解题思路:

hash的简单入门题。

不懂的可以参考这篇文章,很好很强大。http://blog.csdn.net/v_JULY_v/article/details/6256463

通过这道题,学到了hash的简单应用。

hash的优势就在于能快速的查找海量数据,所以速度是hash存在的关键。这样就需要我们在实现hash的时候尽量提高它的速度,也就是用空间换时间。有了这点就可以了。

原来我的内存很小,所以我的程序一直超时。可是内存开大 以后,83s的程序变成了0.3秒。一百倍的差别!!!!!!!!!血的教训!!

代码如下:

[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<cstring>  
  4. #include<string>  
  5. #include<time.h>  
  6. #include<algorithm>  
  7. using namespace std;  
  8.   
  9. #define N 1000010  
  10. #define CLR(arr, what) memset(arr, what, sizeof(arr))  
  11.   
  12. const int fib = 111123;  
  13. int Key[N], Head[N], Next[N];  
  14. int top;  
  15.   
  16. void add(int n)  
  17. {  
  18.     int temp;  
  19.     temp = n % fib;  
  20.     Key[top] = n;  
  21.     Next[top] = Head[temp];  
  22.     Head[temp] = top;  
  23.     top++;  
  24. }  
  25.   
  26. int main()  
  27. {  
  28.     int ncase;  
  29.     char str[8];  
  30.     int num, number;  
  31.     bool flag;  
  32.     CLR(Key, 0);  
  33.     CLR(Head, -1);  
  34.     top = 0;  
  35.     flag = false;  
  36.     scanf("%d", &ncase);  
  37.     while(ncase--)  
  38.     {     
  39.         scanf("%s", str);  
  40.         if(str[0] == 'A')  
  41.         {  
  42.             scanf("%d", &num);  
  43.             for(int i = 0; i < num; ++i)  
  44.             {  
  45.                 scanf("%d", &number);  
  46.                 add(number);  
  47.             }  
  48.         }  
  49.         else  
  50.         {  
  51.             scanf("%d", &num);  
  52.             for(int i = 0; i < num; ++i)  
  53.             {  
  54.                 scanf("%d", &number);  
  55.                 int temp = number % fib;  
  56.                 for(int j = Head[temp]; j != -1; j = Next[j])  
  57.                     if(Key[j] == number)  
  58.                     {  
  59.                         flag = true;  
  60.                         break;  
  61.                     }  
  62.                     printf(flag == true ? "YES\n" : "NO\n");  
  63.                     flag = false;  
  64.             }  
  65.         }  
  66.     }  
  67.     return 0;  
  68. }  
http://blog.csdn.net/niushuai666/article/details/7216787
原创粉丝点击