模拟散列表
维护一个集合,支持如下几种操作:
I x,插入一个整数 x;
Q x,询问整数 x是否在集合中出现过;
现在要进行 N次操作,对于每个询问操作输出对应的结果。
输入格式
第一行包含整数 N,表示操作数量。
接下来 N行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。
输出格式
对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。
每个结果占一行。
存储过程
存储方式:
// 防止出现复数情况
id = (x%N+N)%N
若q[id]!=null & q[id]!=x
id ++
若 id == N
id = 0
代码实现
#include <iostream>
#include <cstring>
using namespace std;
const int N = 3e5 + 3;
const int null = 0x3f3f3f3f;
int q[N];
int Insert(int x){
int u =(x%N + N)%N;
while(q[u]!=null && q[u]!=x){
u++;
if(u==N){
u=0;
}
}
return u;
}
int main(){
int n;
cin>>n;
memset(q, 0x3f3f3f3f, sizeof q);
string op;
int x;
while(n--){
cin>>op>>x;
if(op[0]=='I'){
q[Insert(x)] = x;
}
else{
if(q[Insert(x)]!=null){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
}
}