手搓哈希表
AcWing 840. 模拟散列表
开放寻址法
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e7 + 9, null = 0x3f3f3f3f;
int h[N];
int get_mod(int x) {
return (x % N + N) % N;
}
int find(int x) { // 作用: 将一个大的范围的数映射为一个小范围的数
int t = get_mod(x);
while (h[t] != null && h[t] != x) {
t ++;
if (t == N)
t = 0;
}
return t;
}
void insert(int x) { // 插入
h[find(x)] = x;
}
bool check(int x) { // 检查
if (h[find(x)] != null) return true;
return false;
}
int main() {
memset(h, 0x3f, sizeof h);
char op[2];
int n, t;
cin >> n;
while (n --) {
scanf("%s%d", op, &t);
if (op[0] == 'I') {
insert(t);
} else {
if (check(t)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}
拉链法
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e7 + 9;
int h[N], e[N], ne[N], idx;
int get_mod(int x) {
return (x % N + N) % N;
}
void insert(int x) {
int t = get_mod(x);
e[idx] = x, ne[idx] = h[t], h[t] = idx ++;
}
bool check(int x) {
int t = get_mod(x);
t = h[t];
while (t != -1) {
if (e[t] == x) return true;
t = ne[t];
}
return false;
}
int main() {
memset(h, -1, sizeof h);
char op[2];
int n, t;
cin >> n;
while (n --) {
scanf("%s%d", op, &t);
if (op[0] == 'I') {
insert(t);
} else {
if (check(t)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}