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(' ');} 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',' '},{'Y','e','s',' '}}; 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; }