hash函数均是除留取余法
处理冲突用了两种方法: 拉链法 开放寻址法
拉链法
#include <iostream>
using namespace std;
const int N=1e5+10;
int n1,n2;
int e[N],ne[N],h[N],idx;
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;i=ne[i])\
if(e[i]==x) return true;
return false;
}
int main()
{
cin>>n1>>n2;
for(int i=0;i<n1;i++)
{
int x;
cin>>x;
insert(x);
}
for(int i=0;i<n2;i++)
{
int x;
cin>>x;
if(find(x)) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}
开放寻址法
#include <iostream>
#include <cstring>
using namespace std;
const int N=2e5+3;
int null =0x3f3f3f3f;
int n1,n2;
int h[N];
int find(int x)
{
int k=(x%N+N)%N;
while(h[k]!=null&&h[k]!=x)
{
k++;
if(k==N)k=0;
}
return k;
}
int main()
{
memset(h,0x3f,sizeof h);
cin>>n1>>n2;
for(int i=0;i<n1;i++)
{
int x;
cin>>x;
int k=find(x);
h[k]=x;
}
for(int i=0;i<n2;i++)
{
int x;
cin>>x;
int k=find(x);
if(h[k]==null) cout<<"no"<<endl;
else cout<<"yes"<<endl;
}
return 0;
}