题解0011:图书管理(哈希、vector)
2024-09-05 01:14:09
信奥一本通——哈希 里的例题2
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1456
题目描述:两个命令,一个是进一本名字为s的图书,一个是找现有的图书里有没有名字为s的图书,如果有输出 “噎死” “yes”,没有输出 “no” 。
这道题基础思路是用哈希,将书名的字符串转换成相应的哈希值,再进行查找。
但是
书名的长度最长200,这么大的字符串哈希值看着都腿软。
那怎么办呢?
在c++中有一种数据结构叫vector,是一个动态2维数组,可以将一维的数向下扩充成2维(甚至三维)。
那么,我们就可以在哈希的基础上,用vector进行进一步判断了。
将某串的哈希值模上个质数,然后将原串存在相应 vector [哈希值] 的地方
就像这样:
v[we/*相应哈希值*/].push_back(a);
下面完整代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int b=31;//工具质数
4 int we,q;
5 string a,c;
6 vector<string> v[30000];//必须是string类型的
7 int main(){
8 int n;
9 cin>>n;
10 for(int i=0;i<n;i++){
11 cin>>c;
12 if(c=="add"){
13 getline(cin,a);//因为有空格,所以用这个
14 we=1;
15 for(int j=0;j<a.size();j++){
16 we=(we*b+(long long)a[j])%23333;//求哈希值
17 }
18 v[we].push_back(a);//将字符串存进去
19 }
20 if(c=="find"){
21 getline(cin,a);
22 we=1;
23 for(int j=0;j<a.size();j++){
24 we=(we*b+(long long)a[j])%23333;
25 }//同上
26 q=0;
27 for(int j=0;j<(int)v[we].size();j++){
28 if(v[we][j]==a){//判断字符串是不是相等
29 cout<<"yes"<<endl;
30 q=1;
31 break;//这里可是坑坏了,如果不写break它会打出很多"yes",要不然就在上面查重
32 }
33 }
34 if(q==0){//变量控制
35 cout<<"no"<<endl;
36 }
37 }
38 }
39 }
完美结束
最新文章
- ajax向后台传递数组
- C#中的可空值类型
- IoC实践--用Autofac实现MVC5.0的IoC控制反转方法
- Mount NAS Storage in Linux Overview 转载
- Less/Sass编译工具
- CentOS下启动Tomcat
- POJ3295——Tautology
- TreeList的VisibleNodesCount,Noes.Count,AllNdoesCount以及焦点节点的删除
- input输入限制,只允许输入数字和“.”,长度不得超过20
- React点击操作自动定位到另外一个元素
- Using Dispatcher
- word搜狗输入失效切换方法
- 在linux中,如何增加、修改、删除、暂停和冻结用户名
- 关于作用域范围Scope
- python编译模块为2禁制
- 统计学习方法:支撑向量机(SVM)
- 如何在 React Native 中写一个自定义模块
- PAT——1058. 选择题
- ssh的发展历程与基本原理
- linux命令dmesg查看进程被杀死原因
热门文章
- Hibernate的一级缓存和二级缓存有什么区别?
- kafka unclean 配置代表啥,会对 spark streaming 消费有什么影响?
- IOC——Spring的bean的管理(注解方式)
- Netty学习摘记 —— 再谈ChannelHandler和ChannelPipeline
- canvas系列教程07-canvas动画基础1
- java中Number Type Casting(数字类型强转)的用法
- es5语法下,javascript如何判断函数是new还是()调用
- box-shadow 阴影的高级用法,多个阴影叠加
- 攻防世界——gif
- spring-bean依赖注入-03