NYOJ 138 找球号(二) (哈希)

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

       这道题需要用到哈希表算法,算是hash的入门题了吧,需要注意的是数组需要开的稍微大点,不懂的手动模拟一下那三个数组的用途就好了...


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define mod 100001
#define maxn 1000005
using namespace std;
int Hash[maxn],Next[maxn],Head[maxn];
int n,m;
int num;
string str;

void Add(int x){
  int key = x % mod;
  Next[num] = Head[key];
  Head[key] = num;
  Hash[num] = x;
  num++;
}

bool Query(int x){
  int key = x % mod;
  for(int i=Head[key];i>-1;i=Next[i]){
    if(Hash[i] == x){
      return true;
    }
  }
  return false;
}

int main()
{
  scanf("%d",&n);
  num = 0;
  memset(Head,-1,sizeof(Head));
  while(n--){
    cin>>str;
    if(str == "ADD"){
      scanf("%d",&m);
      for(int i=0;i<m;i++){
        int x;
        scanf("%d",&x);
        Add(x);
      }
    }
    else{
      scanf("%d",&m);
      for(int i=0;i<m;i++){
        int x;
        scanf("%d",&x);
        if(Query(x)) printf("YES\n");
        else printf("NO\n");
      }
    }
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/charles_zaqdt/article/details/81110396
138