1. 程式人生 > >nyoj86 找球號 —— 雜湊

nyoj86 找球號 —— 雜湊

找球號(一)

時間限制:3000 ms | 記憶體限制:65535 KB
難度:3

描述

在某一國度裡流行著一種遊戲。遊戲規則為:在一堆球中,每個球上都有一個整數編號i(0<=i<=100000000),編號可重複,現在說一個隨機整數k(0<=k<=100000100),判斷編號為k的球是否在這堆球中(存在為"YES",否則為"NO"),先答出者為勝。現在有一個人想玩玩這個遊戲,但他又很懶。他希望你能幫助他取得勝利。

輸入

第一行有兩個整數m,n(0<=m<=1000000 , 0<=n<=100000);m表示這堆球裡有m個球,n表示進行n次判斷。
第二行為m個數,分別代表m個球的編號。
第三行為n個數,分別代表n次遊戲中要猜測的數k。

輸出

輸出"YES"或"NO"

樣例輸入

6 4
23 34 46 768 343 343
2 4 23 343

樣例輸出

NO
NO
YES
YES

以前的做法:

#include <cstdio>
#include <set>
typedef long long ll;
using namespace std;
int main() {
	int m, n;
	ll num;
	set<ll>s;
	scanf("%d %d", &m, &n);
	while (m--) {
		scanf("%lld"
, &num); if (!s.count(num)) s.insert(num); } while (n--) { scanf("%lld", &num); s.count(num) ? puts("YES") : puts("NO"); } return 0; }

今天用hash重做一下

#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int mod = 1000003;
inline ll MOD(ll x)
{ return x % mod; } vector<ll>ht[mod]; bool htCount(ll num) { for (auto& x: ht[MOD(num)]) if (x == num) return true; return false; } int main() { int m, n; ll num; scanf("%d %d", &m, &n); while (m--) { scanf("%lld", &num); if (!htCount(num)) ht[MOD(num)].push_back(num); } while (n--) { scanf("%lld", &num); htCount(num) ? puts("YES") : puts("NO"); } return 0; }