查找(二分、hash、桶)
先上一个最简单的题
给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。
第一行两个整数 n 和m。
第二行n个正整数(1<=n<= 100000)
第三行m个整数(1<=m<=100000)
一共m行,若出现则输出YES,否则输出NO
这个题数据很小,既可以用二分、桶、做,也可以用hash来做
用桶的思想来做的话是最简单的,定义一个bool数组,出现的正整数在数组里标记为TRUE;查找sum有没有出现过时只需要调用bool下标为sum的数组就行。
#include<iostream>
using namespace std; bool s[];
int m,n; int main()
{
cin>>n>>m;
for(int i=;i<=n;++i)
{
int sum;
cin>>sum;
s[sum]=true;
}
for(int i=;i<=m;++i)
{
int sum;
cin>>sum;
if(s[sum])cout<<"YES\n";
else cout<<"NO\n";
}
return ;
}
桶
如果数据进一步升级,出现过的数进一步增大,空间进一步限制,这时用bool就不行了,需要用到二分查找,先存数,然后查找即可;
#include<iostream>
#include<algorithm>
#include<string>
using namespace std; bool boo[];
int s[];
int n,m; bool find(int sum)
{
int right=n,left=;
while(right>=left)
{
int mid=left+(right-left)/;
if(s[mid]==sum)return true;
if(mid<sum)left=mid+;
else right=mid-;
}
return ;
} int main()
{
cin>>n>>m;
for(int i=;i<=n;++i)
cin>>s[i];
sort(s+,s+n+);
for(int i=;i<=m;++i)
{
int sum;
cin>>sum;
if(find(sum))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return ;
}
二分查找
最后,如果再进一步升级,咳咳,还是用hash吧;
这里是把数模一个数,然后建立以余数和数的边,查找是将待查找的数取余,查找余数所连接的边。
#include<iostream>
#define mod 4567;
using namespace std; struct node
{
int a,b,next;
};
node s[]; int head[],sum=;
int m,n; void push(int a,int b)
{
s[sum].a=a;
s[sum].b=b;
s[sum].next=head[a];
head[a]=sum++;
} bool find (long long sum)
{
int x=sum%mod;
int y=sum/mod;
for(int k=head[x];k!=-;k=s[k].next)
if(s[k].b==y)return true;
} int main()
{
for(int i=;i<=;++i)
head[i]=-;
int m,n;
cin>>m>>n;
for(int i=;i<=m;++i)
{
long long sum;
cin>>sum;
int x=sum%mod;
int y=sum/mod;
push(x,y);
}
for(int i=;i<=n;++i)
{
long long sum;
cin>>sum;
if(find(sum))
cout<<"YES\n";
else cout<<"NO\n";
}
return ;
}
hash
当然,选用其他的hash函数也是可以的,例如将数的每一位数字加起来,建立边表;当然,选择hash函数的原则对于每一个映射有尽量少的值与之对应,也就是一一对应关系
例如:hash函数%10;则对于1和11,他们对应的hash值一样,就需要存储下每个值,那么算法就会变慢,n为映射值相同的数的数目。
当然,hash所映射的不光是整数,字符串也可以;
现在我又找到了另外一种方法,用STL里的容器MAP就可以;
map是一种关联容器,恩。
看了下百科,表示没看懂;
#include<iostream>
#include<map>
using namespace std;
map<string,int>mapp;
int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;++i)
{
string s;
cin>>s;
mapp.insert(map<string,int>::value_type(s,i));
}
while(m--)
{
string number;
cin>>number;
if(mapp.count(number))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
// if(mapp.find(number)!=mapp.end())
// cout<<"YES"<<endl;
// else cout<<"NO"<<endl;
}
return ;
}
代码
查找(二分、hash、桶)的更多相关文章
- BZOJ 1014: [JSOI2008]火星人prefix [splay 二分+hash] 【未完】
1014: [JSOI2008]火星人prefix Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6243 Solved: 2007[Submit] ...
- PHP实现文本快速查找 - 二分查找
PHP实现文本快速查找 - 二分查找法 起因 先说说事情的起因,最近在分析数据时经常遇到一种场景,代码需要频繁的读某一张数据库的表,比如根据地区ID获取地区名称.根据网站分类ID获取分类名称.根据关键 ...
- 查找练习 hash——出现过的数字 分类: 查找 2015-06-18 17:30 7人阅读 评论(0) 收藏
查找练习 hash--出现过的数字 *Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 有一个数据字典,里面存有n个数字(n<=10 ...
- BZOJ1014: [JSOI2008]火星人prefix(splay 二分 hash)
题意 题目链接 Sol 一眼splay + 二分hash,不过区间splay怎么写来着呀 试着写了两个小时发现死活不对 看了一下yyb的代码发现自己根本就不会splay.... // luogu-ju ...
- 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash
题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...
- BZOJ4698: Sdoi2008 Sandy的卡片(二分 hash)
题意 题目链接 Sol 用什么后缀数组啊 直接差分之后 二分+hash找最长公共子串就赢了啊... 时间复杂度:\(O(nlogn)\)(不过我写的是两个log..反正也能过) // luogu-ju ...
- UVA12206 Stammering Aliens 【SAM 或 二分 + hash】
题意 求一个串中出现至少m次的子串的最大长度,对于最大长度,求出最大的左端点 题解 本来想练哈希的,没忍住就写了一个SAM SAM拿来做就很裸了 只要检查每个节点的right集合大小是否不小于m,然后 ...
- 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
[BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...
- LOJ#111. 后缀排序(二分 hash)
题意 给出一个字符串,求出排名为$i$个字符串在原串中的开始位置 Sol 纪念一下这伟大的时刻qwq. 我用二分+hash把这题水过去了qwq. #include<cstdio> #inc ...
- UVA - 12338 Anti-Rhyme Pairs 二分+hash
题目链接:传送门 题意: 给你n个串 问你任意两个串的最大公共前缀长度是多少 题解: 二分+hash 思路很明显,我最近用来写hash 很鸡肋 #include<bits/stdc++.h> ...
随机推荐
- java设计模式之适配器模式以及在java中作用
适配器作用就是讲一个接口适配到另一个接口,在Java 的I/O类库中有很多这样的需求,如将字符串数据转变成字节数据保存到文件中,将字节数据转变成流数据等. 以InputStreamReader和Out ...
- RMQ问题+ST算法
一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...
- Postmortem Report 第一轮迭代事后分析报告
一.设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件<BlueZ>是一款全新动作类塔防游戏.与市面上已经存在的塔防游戏不同 ...
- winform 控件半透明设置
1.backcolor属性为color.FromArgb(100, 220, 220, 220); 2.全透明设置为transparent方法.
- PTA实验报告(循环 数组 函数)
一.循环PTA实验作业 题目一.7-2 求平方根序列前N项和 1.本题PTA提交列表 2.设计思路 本题调用了sqrt数学函数计算平方根,其次只用了一层循环,计算平方根之后使用循环累加计算总和sum. ...
- 【工作感悟】——xyb项目部署
[前言] 接手xyb项目维护有一段时间了,除了熟悉业务需求和开发环境外,还没有进行新需求的开发.前几天突然接到一个任务,要去发改委给他们部署一版最新的系统.本来事情也不大,也没有很难.但是本来是大屈. ...
- 黑群晖DSM 6.1网卡支持列表
黑群晖DSM 6.1网卡支持列表 Network Drivers====================================AMDamd8111e : AMD 8111 (new PCI ...
- JS Cookie相关操作
function setCookie(cookieName, cookieValue, expires) { // 设置Cookie function getCookieName(cookieName ...
- SQLMap的前世今生(Part1)
http://www.freebuf.com/sectool/77948.html 一.前言 谈到SQL注入,第一时间就会想到神器SQLMAP,SQLMap是一款用来检测与利用的SQL注入开源工具.那 ...
- (转)HTTP请求中URL地址的编码和解码
HTTP请求中,类似 http%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html 的地址 如何解码成 http://www ...