给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
一共m行,若出现则输出YES,否则输出NO
4 2
2 1 3 4
1 9
YES
NO
所有数据都不超过10^8
分类标签 Tags
哈希60分RE代码 head数组开小了
#include <iostream> #include <cstring> #include <cstdio> #define mo1 12421 #define mo2 34343 using namespace std; struct node { int next; int to; }e[100001]; int n,m,i,j,tot,head[10001]; void add(int u,int v) { tot++; e[tot].next=head[u]; e[tot].to=v; head[u]=tot; } int get_hash(int k) { int h=0; while(k) { h=h*13+k%10; k/=10; } return h%mo2; } bool query(int u,int v) { for(int i=head[u];i;i=e[i].next) { if(e[i].to==v) return true; } return false; } int main() { int a; cin>>n>>m; while(n--) { cin>>a; int y=get_hash(a); add(a,y); } while(m--) { cin>>a; int y=get_hash(a); if(query(a,y)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
哈希满分做法
#include <iostream> #include <cstring> #include <cstdio> #define mo1 12421 #define mo2 34343 using namespace std; struct node { int next; int to; }e[100001]; int n,m,i,j,tot,head[100001]; void add(int u,int v) { tot++; e[tot].next=head[u]; e[tot].to=v; head[u]=tot; } int get_hash(int k) { int h=0; while(k) { h=h*13+k%10; k/=10; } return h%mo2; } bool query(int u,int v) { for(int i=head[u];i;i=e[i].next) { if(e[i].to==v) return true; } return false; } int main() { int a; cin>>n>>m; while(n--) { cin>>a; int y=get_hash(a); add(a,y); } while(m--) { cin>>a; int y=get_hash(a); if(query(a,y)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
STL满分做法
#include<map> #include<iostream> using namespace std; int s[100001]; map<int,bool>g; int main() { int n,m,ss; cin>>n>>m; for(int i=1;i<=n;++i) { cin>>s[i]; g[s[i]]=1; } for(int i=1;i<=m;++i) { cin>>ss; if(g[ss]==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }