C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码

马上就开学了,又一个卷季,不写点东西怎么行呢?辣么,我不准备写那些dalao们都懂得,熟练的,想来想去,最终还是写哈希表吧!提供讲解&题目&代码解析哦!


奉上题目链接:

洛谷题目 - 哈希,hash

1、哈希、哈希表(hash)简介

哈希(Hash)是一种将任意长度的输入映射为固定长度输出的算法。哈希函数的输出值称为哈希值或散列值。哈希函数具有以下特性:

  1. 确定性:对于相同的输入,哈希函数总是生成相同的哈希值。
  2. 快速计算:哈希函数可以在较短的时间内计算出哈希值。
  3. 不可逆性:根据哈希值无法还原出原始的输入值。
  4. 雪崩效应:输入的微小变化会导致哈希值的大幅度变化。

哈希表(Hash Table)是基于哈希函数实现的一种数据结构,也称为散列表。它通过将键(key)通过哈希函数映射到数组的特定位置来存储值(value)。哈希表的关键特点是能够以常数时间复杂度实现键值对的插入、删除和查找操作。

哈希表通常包含以下几个核心组件:

  1. 哈希函数:根据键生成哈希值的函数。
  2. 数组:用于存储键值对。每个数组元素称为一个“桶”(bucket)或“槽”(slot)。
  3. 冲突解决方法:由于哈希函数的输出值是固定长度的,不同的键可能会映射到相同的槽位,这种情况称为冲突。常见的冲突解决方法有开放地址法和链地址法。
  4. 动态扩容:当哈希表中的数据量增加时,为了保持较低的查询时间,需要动态扩容数组的大小。

哈希表在实际应用中具有广泛的应用,如数据库索引、缓存实现、密码学中的消息摘要算法等。它通过将大量的键映射到数组的不同位置,从而提高了查找和操作的效率。

2、哈希表的代码示例以及STL中的应用

以下是一个使用哈希函数和哈希表的代码示例:

#include <iostream>
#include <unordered_map>int main() {// 创建一个哈希表std::unordered_map<std::string, int> hashTable;// 添加键值对到哈希表中hashTable["apple"] = 5;hashTable["banana"] = 3;hashTable["orange"] = 7;// 查找键对应的值std::cout << "The value of 'apple' is: " << hashTable["apple"] << std::endl;// 遍历哈希表for (const auto& pair : hashTable) {std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;}// 检查键是否存在于哈希表中if (hashTable.count("banana") > 0) {std::cout << "'banana' exists in the hash table." << std::endl;}// 删除键值对hashTable.erase("orange");// 检查键是否存在于哈希表中if (hashTable.count("orange") > 0) {std::cout << "'orange' exists in the hash table." << std::endl;} else {std::cout << "'orange' does not exist in the hash table." << std::endl;}return 0;
}

在STL模板库中,C++提供了std::unordered_map作为哈希表的实现。std::unordered_map提供了一些常见的操作方法,如插入、查找、删除等,并且保证这些操作的平均时间复杂度为常数。

除了std::unordered_map,STL模板库还提供了其他基于哈希表的容器和算法:

  • std::unordered_set:基于哈希表实现的集合容器,用于存储唯一的元素。
  • std::unordered_multiset:基于哈希表实现的多重集合容器,可以存储重复的元素。
  • std::unordered_multimap:基于哈希表实现的多重映射容器,可以存储键值对,并且允许键的重复。

这些容器在STL中的应用广泛,能够快速地进行元素查找和插入操作。使用这些容器可以方便地实现哈希表相关的功能。

3、题目及代码解析

应该各位dalao都听腻了吧,那么我也不能说了,直接进入正文

P7774 [COCI2009-2010#2] KUTEVI

基本上能用哈希表解决的问题都可以用动态规划dp 或 搜索来解决,本题也不例外(用dp的完全背包就能轻松化解,我怎么这么聪明呢

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
//完全背包:记得对360取模!
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);ll n, m;cin >> n >> m;vector<ll> a(n + 1, 0), b(m + 1, 0);for (ll i = 1; i <= n; i++) cin >> a[i];for (ll i = 1; i <= m; i++) cin >> b[i];vector<ll> dp(1005, 0);//一定要初始化!dp[0] = 1;for (ll i = 1; i <= n; i++) {for (ll j = 0; j <= 1000; j++) {if (j >= a[i])dp[j % 360] |= dp[(j - a[i]) % 360];dp[j % 360] |= dp[(j + a[i]) % 360];}}for (ll i = 1; i <= m; i++) {if (dp[b[i]] == 1) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}

P2957 [USACO09OCT] Barn Echoes G

这道题就比较简单了,主要一句话:最长公共字序列,就考字符串+前缀/后缀哈希 (很水)

我的解题思路(十分简单,简洁易懂):暴力暴力再暴力!

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
typedef long long ll;
string a, b;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin >> a >> b;//调换位置,避免使用substr函数求子串时访问越界if (a.size() > b.size()) swap(a, b);//i代表回声的长度for (ll i = a.size() - 1; i >= 0; i--) {//一个求前缀,一个求后缀string prea = a.substr(0, i), sufa = a.substr(a.size() - i, i);string preb = b.substr(0, i), sufb = b.substr(b.size() - i, i);//只要一个字符串的前缀=另一个字符串的后缀,输出即可if (prea == sufb || preb == sufa) {cout << i << endl;return 0;}}return 0;
}

P3879 [TJOI2010] 阅读理解

天津省选,似乎不难,看起来是考字符串+哈希应用,其实就是考这个

STL直接搞定!map+vector

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;ll n, m, num;
//cnt计数器
ll cnt[100001];
string s;
map<string, vector<ll>> a;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin >> n;for (ll i = 1; i <= n; i++) {cin >> num;for (ll j = 1; j <= num; j++) {cin >> s;//实现了vector的压入操作,虽然没定义vector,但我的每一个单词就是一个vectora[s].push_back(i);}}cin >> m;for (ll i = 1; i <= m; i++) {cin >> s;//cnt就是去重的桶,每一次查询都要清零memset(cnt, 0, sizeof(cnt));for (ll j = 0; j < a[s].size(); j++) {if (cnt[a[s][j]] == 0) {cout << a[s][j] << " ";//去重  cnt[a[s][j]]++;}}cout << endl;}return 0;
}

P3370 【模板】字符串哈希

模板题,顾名思义,就是 模板题 有一个统一规范代码的题目,代码一般来讲都很简洁明了,那就看一下这道题目怎么样

TIP:这……这题目挺贴心的啊……《真·友情提醒》

贴心

我准备 忽略题目的话,为何不用set?!

谁说的不能用红黑树实现!

嗯~ STL的set真香~

#include <iostream>
#include <set>
using namespace std;
typedef long long ll;
//set闪亮登场!!!
set<string> s;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);string p;ll n;cin >> n;for (ll i = 0; i < n; i++) {cin >> p;s.insert(p);}//打印大小(自动去重、排序)cout << s.size() << endl;return 0;
}

大功告成!!!!!!!!!

AC

关注我,我会继续更新文章,让大家尝鲜的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413477.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试——论坛系统测试用例

功能测试 其他测试 测试用例 用例编号 用例描述 优先级 预置条件 操作步骤 测试数据 预期结果 测试结果Bug ID软件版本测试员SNS_User_Register_001注册成功使用合法的数据成功注册一个新账号P11、已打开注册页面 2、准备一个未注册用户信息1、输入用户昵称 2、输入用户名 3、…

【前端开发必备小技巧】前端代码规范Vue篇

文章目录 &#x1f7e2; 前端代码规范&#x1f7e2; 一、前端代码规范Vue篇&#x1f449;1、Vue编码基础&#x1f449;1.1、组件规范&#x1f449;1.2、模板中使用简单的表达式&#x1f449;1.3、指令都使用缩写形式&#x1f449;1.4、 标签顺序保持一致&#x1f449;1.5、必须…

【IEEE独立出版 | 往届快至会后2个月检索】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024,9月27-29)

2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机学院、长春理工大学人工智能学院承办&#xff0c;多…

生产环境变态开启devtools(redux篇)

前沿 默认都安装了谷歌的redux-devtools插件哦 没有亮,说明关闭了生产环境的redux devtools工具, 接下来跟着博主一起变态启用它 如果看了我上一篇的小伙伴,应该会很熟练了,如果没有看上一篇的,也没关系,博主会手摸手的教你们打开它。 正常的解决方案(适用内部开发人员…

学院个人信息|基于SprinBoot+vue的学院个人信息管理系统(源码+数据库+文档)

学院个人信息管理系统基于SprinBootvue的学院个人信息管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 学生模块实现 教师模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

浅谈常见的分布式ID生成方案

一、UUID UUID是通用唯一标识码的缩写&#xff0c;其目的是让分布式系统中的所有元素都有唯一的辨识信息&#xff0c;而不需要通过中央控制器来指定唯一标识。 优点&#xff1a; &#xff08;1&#xff09;降低全局节点的压力&#xff0c;使得主键生成速度更快&#xff1b; &…

青蛙跳台阶与汉诺塔问题

hello&#xff0c;各位小伙伴们上次我们复习了C语言小tip之函数递归&#xff0c;这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题&#xff01; 青蛙跳台阶问题 青蛙跳台阶问题&#xff1a;一只青蛙跳n阶台阶&#xff0c;一次可以跳1阶或者两阶&#xff0c;问有多少种情况…

list类底层逻辑实现

list的底层逻辑是一个双向带头链表。那么list的底层其实就跟我们之前实现的带头双向链表相同&#xff0c;都是开辟一个一个单独的节点&#xff0c;最后再通过指针将各个单独的节点链接起来即可。 我们来类比之前编写的双向带头链表实现具体的内容。 创建一个list类的主体 就像我…

Bazel 快速入门与核心知识

Bazel 快速入门与核心知识 Bazel 简介 Bazel 是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目 (C/C, Java, Python, …)&#xff0c;可为多个平台构建输出。Bazel 支持跨多个代码库和大量用户的大型代码…

ncnn之yolov5(7.0版本)目标检测pnnx部署

一、pnxx介绍与使用 pnnx安装与使用参考&#xff1a; https://github.com/pnnx/pnnxhttps://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnxhttps://github.com/Tencent/ncnn/tree/master/tools/pnnx 支持python的首选pip&#xff0c;否则就源码编译。 pip3 …

opencv/c++的一些简单的操作(入门)

目录 读取图片 读取视频 读取摄像头 图像处理 腐蚀 膨胀 调整图像大小 裁剪和缩放 绘制 绘制矩形 绘制圆形 绘制线条 透视变换 颜色检测 轮廓查找 人脸检测 检测人脸 检测嘴巴 可适当调整参数 读取图片 读取路径widows使用vis sto一定是\斜杠 #include <o…

界面控件Telerik UI for ASP.NET Core 2024 Q2亮点 - AI与UI的融合

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 本文将介绍界面组件Teler…

【服务对接】✈️SpringBoot 项目整合华为云 obs 对象存储服务

目录 &#x1f44b;前言 &#x1f440;一、环境准备 &#x1f331;二、整合实现 1.依赖引入 2.准备 AK 和 SK ​ 3.配置类 4.obs 工具类封装 &#x1f49e;️三、测试使用 &#x1f37b;四、 obs 客户端 &#x1f4eb;五、章末 &#x1f44b;前言 小伙伴们大家好&…

Oracle查询优化--分区表建立/普通表转分区表

本文介绍了Oracle表分区的方法&#xff0c;将已有的非分区表转化为分区表&#xff0c;也可以直接建立新的分区表&#xff0c;从而实现大表查询的优化。主要通过DBMS_REDEFINITION 和 alter table xxx modify 方法&#xff0c;DBMS_REDEFINITION 适用于所有版本&#xff0c;操作…

计算机毕业设计选题推荐-大学生竞赛管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【C++ 第十六章】哈希

1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 &#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c;进行…

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述 基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同步…

两个月冲刺软考——关系模式中的候选关键字与如何分解为无损连接并保持函数依赖的解法(例题讲解,看完必会)

1. 数据库中的简单属性、多值属性、复合属性、派生属性 简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值。例如一个学生可能会有多个…

栈OJ题——有效的括号

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 有效的括号 题目描述&#xff1a;给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。括号匹配。 二、…

异业联盟的巅峰之作!某店生活 两年百亿销售额!

大家好 我是一家软件开发公司的产品经理 吴军 最近有个爆火的商业模式 带动了三方消费 平台能赚到钱 消费者能省钱 商家也能获取到客源甚至还能赚钱 他究竟是怎么样做到三方都赚到钱的&#xff1f; 在当前经济形势下&#xff0c;许多消费者变得谨慎&#xff0c;减少了不必…