【模板】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;
}





posted @ 2018-02-23 18:35  绍兴土匪  阅读(372)  评论(0编辑  收藏  举报