nyoj86 找球號 —— 雜湊
阿新 • • 發佈:2018-11-24
找球號(一)
時間限制: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;
}