nyoj86 找球号 —— 哈希

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/84037493

找球号(一)

时间限制: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;
}

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/84037493