码迷,mamicode.com
首页 > 其他好文 > 详细

Codevs_1230_元素查找(set/Hash)

时间:2016-05-13 18:49:50      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

描述


http://codevs.cn/problem/1230/

...

 

分析


就是见识了一下简单的Hash是啥...set也可以做(其实我也不会用set).

给出一组数,查找其中是否存在某一个数x.很容易想到搞个桶,但是数字如果很大,比如整型上限,桶就开不下了,可以离散处理(以前一直用的自己脑补的离散方法).用Hash的话就是:假设共n个数,则记mod为任意一个大于等于n的数,这样x%mod在[0,mod-1],至少有n种不同的值,然后以模作为数组下标,如果已经被占了就往后走.查找的时候也是,如果被其他数占了就往后走,如果走到空的还没有找到,说明没有这个数(如果有就会占到空位).

 

技术分享
#include <cstdio>
#include <set>
using namespace std;

int n,m,x;
int main(){
    scanf("%d%d",&n,&m);
    set <int> s;
    for(int i=1;i<=n;i++) scanf("%d",&x),s.insert(x);
    for(int i=1;i<=m;i++) scanf("%d",&x),s.count(x)?puts("YES"):puts("NO");
    return 0;
}
set

 

技术分享
#include <cstdio>

const int mod=1e5+7;
int a[mod];
inline void insert(const int &x){ for(int k=x%mod;a[k]!=x;k=(k+1)%mod) if(!a[k]) { a[k]=x; return; } }
inline bool search(const int &x){ for(int k=x%mod;a[k]!=x;k=(k+1)%mod) if(!a[k]) return false; return true;}

int n,m,x;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&x),insert(x);
    for(int i=1;i<=m;i++) scanf("%d",&x),search(x)?puts("YES"):puts("NO");
    return 0;
}
Hash

 

Codevs_1230_元素查找(set/Hash)

标签:

原文地址:http://www.cnblogs.com/Sunnie69/p/5490283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!