查找(二分、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> ...
随机推荐
- jira+mysql+破解+中文+compose
1.制作docker-compose.yml 2.安装 $ docker stack deploy -c docker-compose.yml mshk_jira
- docker基础-虚拟化与容器介绍
正如所有关心docker技术的人所知道的那样,docker是以容器虚拟化为技术为基础的软件,因此在学习docker具体的内容之前,有必要讨论一下虚拟化和容器技术. 虚拟化技术: 在了解虚拟化技术时,各 ...
- maven环境变的配置(复制自己看)
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺省构建 ...
- 父窗体和子窗体的显示,show&showdialog方法
showdialog(): 子窗体弹出后,不能对父窗体进行操作.show()可以. 具体原理: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form.ShowDi ...
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- [POJ1631]Bridging signals
题目大意:不知,根据样例猜测为最长上升子序列(竟然还对了) 题解:$O(n log_2 n)$,求二维偏序,(q为存答案的序列,a存原序列,len为答案) for(int i = 1; i <= ...
- 【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)
读了一下题就会很愉快的发现,这个数列是关于p的幂次的斐波那契数列,很愉快,然后就很愉快的发现可以矩阵快速幂一波,然后再一看数据范围就......然后由于上帝与集合对我的正确启示,我就发现这个东西可以用 ...
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) A
A. Bear and Game time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- synchronized ---- 作用
获得同步锁: 1.清空工作内存: 2.从主内存拷贝对象副本到工作内存: 3.执行代码(计算或者输出等): 4.刷新主内存数据: 5.释放同步锁.
- VS2010 VC Project的default Include设置
在IDE中,打开View->Other Windows->Property Manager.展开树形后,你会发现一个名为“Microsoft.Cpp.Win32.user”的项目(如下图) ...