【模板】Hash拉链法
Hash的挑战
(hash.cpp/c/pas)
Time Limit:1Sec Memory Limit:128 MB
问题背景
土匪帮主写作业的时候遇到了一道搜索题,用map结果TLE了3个点。经过无数次调 试,才发现map的时间复杂度原来是n*log2(n),为此土匪就来学习HASH。但合适的教程,于是向您请教,如果你愿意,就先来接受土匪的挑战,证明下你的HASH是正确的吧!
问题描述
具体测试内容如下:由土匪给定一串长度为n的数组,在规定的时间内回答m组问题,每个问题都很简单,你需要回答每一个给的数字是否出现在给定的数组内。如果这个数字存在,请输出Yes;否则输出No。
Intput
第一行有一个正整数n,表示待查询数组的元素个数。 接下来第i+1行表示第i个元素的值。第n+2行一个正整数m,表示待查询的元素个数。再接下来第n+2+i行表示第i个待查询元素的值。
Output
输出共m行,每一行输出Yes或者No。
Data Limitation
30%的数据满足:1<=m,n,A[i],B[i]<=10000
60%的数据满足:A[i],B[i]<=1000000000,1<=m,n<=1000000
100%的数据满足:1<=m,n,A[i],B[i]<=20000000
【题解】
#include<cstdio>
inline int read(){char ch=getchar(),w=1;int x=0;while(ch<'0'||ch>'9'){if(ch=='-')w=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return w*x;}
inline void wr(int x){if(x<0)putchar('-'),x=-x;if(x>9)wr(x/10);putchar(x%10+'0');}
inline void wrln(int x){wr(x);putchar('\n');}
const int mod=100003;
struct Node{
int key;
Node* nxt;
Node(){
key=0;
nxt=NULL;
}
};
Node H[mod+1000];
int hash(int val){
return val%mod;
}
bool search(int v){
int id=hash(v);
Node *p=H[id].nxt;
for(;p;p=p->nxt)if(p->key==v)return true;
return false;
}
void Insert(int v){
if(search(v))return;
int id=hash(v);
Node *p=new Node();
p->key=v;
p->nxt=H[id].nxt;
H[id].nxt=p;
return;
}
char ans[2][12]={{'N','o','\0'},{'Y','e','s','\0'}};
int main(){
freopen("hash.in","r",stdin);
freopen("hash.out","w",stdout);
int n,m,a;
n=read();
for(int i=1;i<=n;i++){
a=read();
Insert(a);
}
m=read();
for(int i=1;i<=m;i++){
a=read();
puts(ans[search(a)]);
}
return 0;
}

浙公网安备 33010602011771号