[AcW]840模拟散列表
tips:
1.离散化强调“保序性”,即映射之前如果具有小于关系,映射之后仍需要保证小于关系。
2.代码是逻辑的实现,拉链法就是用物理空间解决逻辑上的冲突。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100003;
int h[N],e[N],ne[N],idx;
//定义为全局变量会自动初始化
/*
每个元素对应唯一一个编号,用这个编号来关联所有的信息,
e数组用这个编号存这个元素的值,ne数组用这个编号存插入时链中另一元素的编号。
*/
void insert(int x){
int k=(x%N+N)%N;
e[idx]=x;
ne[idx]=h[k];
h[k]=idx++;
}
//下标和数组被赋予的内涵,你逻辑想法的落脚点(实现方式),由抽象到具体。
bool find(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(){
int n;
scanf("%d",&n);
memset(h,-1,sizeof(h));
while(n--){
char op[2];
int x;
scanf("%s%d",&op,&x);//scanf读入字符串,过滤空格
if(*op == 'I') insert(x);
else{
if(find(x)) puts("Yes");
else puts("No");
}
}
return 0;
}
ps:
学会编程语言实现,然后脱离语言,摆脱编程语言的束缚,自然语言思考