AcWing 840. 模拟散列表
原题链接
简单
作者:
minux
,
2020-04-24 22:53:32
,
所有人可见
,
阅读 545
解法1:拉链法
#include <bits/stdc++.h>
using namespace std;
// 使用数组模拟哈希表
const int N=100003;
int h[N], e[N], ne[N], idx;
int n;
// 向散列表中插入数据
void insert(int x){
int k=(x%N+N)%N;
e[idx]=x; // 元素存储
ne[idx]=h[k]; // next指针指向为h[k], 建立索引
h[k]=idx++;
}
// 在散列表中查询数据
bool query(int x){
int k=(x%N+N)%N;
for(int i=h[k]; i!=-1; i=ne[i]){
if(e[i]==x) return true;
}
return false;
}
int main(){
cin>>n;
memset(h, -1, sizeof h);
memset(e, 0x00, sizeof e);
memset(ne, 0x00, sizeof ne);
idx=0;
while(n--){
string P;
int x;
cin>>P;
if(P=="I"){
cin>>x;
insert(x);
}
else if(P=="Q"){
cin>>x;
if(query(x))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
return 0;
}
解法2:开放寻址法
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
// 使用数组模拟哈希表
const int N=200003;
int h[N];
int n;
// 在散列表中查询数据
int query(int x){
int k=(x%N+N)%N;
// 当不是空位并且存储的值不等于x时继续进行查找
while(h[k]!=INF && h[k]!=x){
++k;
if(k==N)
k=0;
}
return k;
}
int main(){
cin>>n;
memset(h, 0x3f, sizeof h);
while(n--){
string P;
int x;
cin>>P>>x;
int k=query(x);
if(P=="I"){
h[k]=x;
}
else if(P=="Q"){
if(h[k]!=INF)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
return 0;
}