codevs1230元素查找(hash)

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

 

两种哈希基本写法:

//哈希表

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>

#define MAXN 1000008
#define MOD 1000007

using namespace std;

int hashTable[MAXN];

void update(int x) //将数字x加入哈希表
{
    int num=x;
    x%=MOD;
    while(1)
    {
        if(!hashTable[x])
        {
            hashTable[x]=num;
            return;
        }
        if(hashTable[x]!=num)
        {
            x++;
            if(x==MAXN) x=0;
        }
        else return;
    }
}

bool query(int x) //查找哈希表中是否有数字x
{
    bool found=false;
    int num=x;
    x%=MOD;
    while(1)
    {
        if(!hashTable[x]) return false;
        if(hashTable[x]!=num)
        {
            x++;
            if(x==MAXN) x=0;
        }
        else return true;
    }
}

int main()
{
    int n,m,x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(x+1);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&x);
        if(query(x+1)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
心若向阳,无言悲伤

 

//单模建边(这个题数据水)

#include<iostream>
using namespace std;
const int maxn=500010;
int n,m,tot,tmp,head[maxn];
struct node
{
    int to;
    int next;
}e[maxn];
int get_hash(int x)
{
    return x%10007;
}
void add_edge(int u,int v)
{
    tot++;
    e[tot].to=v;
    e[tot].next=head[u];
    head[u]=tot;
}
bool find(int u,int v)
{
    for(int i=head[u];i;i=e[i].next)
    if(e[i].to==v)return 1;
    return 0;
}
int main()
{
    int x,y;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>tmp;
        x=get_hash(tmp);
        add_edge(x,tmp);
    }
    for(int i=1;i<=m;i++)
    {
        cin>>tmp;
        x=get_hash(tmp);
        if(find(x,tmp))
        cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
心若向阳,无言悲伤

map水过...

#include<cstdio>
#include<iostream> 
#include<map>
using namespace std;
map<int,int>ma;
int n,m,a[100001],x;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        ma[a[i]]=1;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>x;
        if(ma[x]) cout<<"YES"<<endl;
          else cout<<"NO"<<endl;
    }
    return 0;
}
心若向阳,无言悲伤

 

 

posted @ 2016-12-18 21:03  安月冷  阅读(234)  评论(0编辑  收藏  举报