拉链法-模拟散列表
应用
1. 直接下标映射,但是范围太大
2. 顺序查找,复杂度太高
两种操作
1. insert插入
2. query查询
拉链法
每个映射位,后面可以跟多个数,通过链表串联
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100003;
int q[N];
int h[N], e[N], ne[N], cnt;
void insert(int x) {
int k = (N + x % N) % N;
for (int i = h[k]; ~i; i = ne[i]) {
if (e[i] == x) return;
}
e[cnt] = x;
ne[cnt] = h[k];
h[k] = cnt++;
}
int query(int x) {
int k = (N + x % N) % N;
for (int i = h[k]; ~i; i = ne[i]) {
if (e[i] == x) return 1;
}
return 0;
}
int main() {
int n;
memset(h, -1, sizeof h);
cin >> n;
for (int i = 0; i < n; i++) {
char s[2];
int x;
scanf("%s%d", s, &x);
if (s[0] == 'I') {
insert(x);
} else {
if (query(x)) puts("Yes");
else puts("No");
}
}
return 0;
}