1230 元素查找

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。

输入描述 Input Description

第一行两个整数 n 和m。

第二行n个正整数(1<=n<= 100000)

第三行m个整数(1<=m<=100000)

输出描述 Output Description

一共m行,若出现则输出YES,否则输出NO

样例输入 Sample Input

4 2

2 1 3 4

1 9

样例输出 Sample Output

YES

NO

数据范围及提示 Data Size & Hint

所有数据都不超过10^8

在对于询问进行处理时,最简单的方法进行查找是O(n)即在数组里一个个查询,而这样速度很慢,虽然可以进行二分但时间复杂度依然是logn。

这时我们就要时用哈希表,取每个元素的值为key值,对10007(或者另个较大的质数)取mod进行记录,这样即可O(1)查询

但对于每个数a,hash(a)可能相同而用vector进行记录即可防止重复

查询时与记录过程类似,不做赘述。

#include<cstdio>
#include<vector>
using namespace std;
const int mod=10007;
int hash(int x)
{
    return x%mod;
}
vector<int>x[10009];//不定长数组以防止出现重复
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    while(n--)
    {
        int a;
        scanf("%d",&a);
        x[hash(a)].push_back(a);//对于每个值将其转为hash(a)。
    }
    while(m--)
    {
        int a,t,pd=0;
        scanf("%d",&a);
        t=hash(a);
        for(int j=0;j<x[t].size();j++)
            if(x[t][j]==a) pd=1;
        if(pd) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}