《洛谷深入浅出基础篇》 p3370字符串哈希——hash表

news2024/11/30 4:58:43

上链接:

P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P3370#submit上题干:

就是说,给你N个字符串,然后让你判断,这N个字符串里面有多少不同的字符串(用hash做)

 将这个问题简化,比如,给你10^6个数字,然后让你计算一下有多少不同的数字。

由于数据不大,所以我们可以直接用数组模拟。开一个10^6的数组,然后出现哪个数字,标记哪个数字就行了。最后再计算有多少个数字被标记了。

那如果给10^9个数字,显然我们无法开一个10^9的数组。

那我们应该怎么做呢?

我们可以对这些数字进行取模运算。

例如mod=1007,然后将每个数字取模,存入vector中,即 vector[ x%mod ][ i ],

然后每次查询,是否vector里面是否有该数字,如果没有,就push_back(),然后将答案++

但是显然,如果取模1007的话,显然是可能会有很多重复的情况,我们叫做”哈希碰撞“

如果有很多重复的话,我们就要花费额外的次数去查询,这样时间复杂度会比较高。

所以,我们尽量让每个数值的哈希值不相同。

所以我们可以设置一个base值。

拿这道题为例子

假如这个数据类型是字符串,我们就可以用字符串里面的每个字符的ascii码来求哈希值,

最笨的做法就是求每个字符串的ascii码之和作为哈希值,

这样的话,如果所有的字符串的ascii码之和都是相同的,那么时间复杂度将爆炸,很容易被hack

所以我们希望对它进行改进:

假如一个字符串为   abcdefgh。

其哈希值可以是: a+(a*base+b)+(a*base^2+b*base+c)........

这样可以使得每个字符串的哈希值都是不同的。

这样我们每次查询的次数就是1,甚至可以不需要查询。

所以,这也就是用空间换时间的典型例子。

上代码:


typedef long long int LL;
const int mod = 1007;
const int base = 117;
vector<string> linker[mod + 2];
string s;
int ans;
void insert1(string s)
{
	int hash = 0;
	for (int i = 0; i < s.size(); i++)
	{
		hash = (hash*1ll*base + (LL)s[i]) % mod;
	}

	for (int i = 0; i < linker[hash].size(); i++)
		if (linker[hash][i] == s)return;
	linker[hash].push_back(s);
	ans++;
}
int main()
{
	int n;
	cin >> n;
	while (n--)
	{
		cin >> s;
		insert1(s);
	}
	cout << ans;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谭巍主任科普:面对HPV感染挑战,迈出关键一步!

在当今社会&#xff0c;HPV(人乳头瘤病毒)感染的问题日益凸显&#xff0c;它不仅限于性传播疾病&#xff0c;更上升为一种公共卫生问题。据统计&#xff0c;全球范围内每年有大量人群感染HPV&#xff0c;其中部分地区感染率高达50%。正因如此&#xff0c;谭巍主任投身于科普事业…

表单校验wed第十九章

常见的表单验证 一。表单选择器 属性过滤选择器 &#xff1a;selected 选中所有的下拉元素 &#xff1a;checked&#xff1a;选项元素 &#xff1a;disabled 不可用元素 &#xff1a;enable 所有可用元素 二。字符串演示 1.判断非空 isNaN(j) :判断是否为数字 2.表…

flutter绘制弧形进度条

绘制: import package:jade/utils/JadeColors.dart; import package:flutter/material.dart; import dart:math as math; import package:flutter_screenutil/flutter_screenutil.dart;class ArcProgressBar extends StatefulWidget{const ArcProgressBar({Key key}) : super…

蘑菇街获得mogujie商品详情 API 返回值说明

速卖通API接口是速卖通平台提供的一种数据交换接口&#xff0c;可以帮助卖家快速获取平台上的商品信息、订单信息、用户信息等数据&#xff0c;以便在自己的应用程序中进行展示、管理或分析。 速卖通API接口可以通过以下步骤进行使用&#xff1a; 注册速卖通账号并获取API密钥…

SystemVerilog学习 (7)——面向对象编程

一、概述 对结构化编程语言,例如Verilog和C语言来讲&#xff0c;它们的数据结构和使用这些数据结构的代码之间存在很大的沟壑。数据声明、数据类型与操作这些数据的算法经常放在不同的文件里,因此造成了对程序理解的困难。 Verilog程序员的境遇比C程序员更加棘手,因为 Verilog …

React父组件怎么调用子组件的方法

调用方法&#xff1a;1、类组件中的调用可以利用React.createRef()、ref的函数式声明或props自定义onRef属性来实现&#xff1b;2、函数组件、Hook组件中的调用可以利用useImperativeHandle或forwardRef抛出子组件ref来实现。 【程序员必备开发工具推荐】Apifox一款免费API管理…

STM32CubeIDE报“xxx is not implemented and will always fail”解决方法

本文介绍STM32CubeIDE报“xxx is not implemented and will always fail”解决方法。 最近用STM32CubeIDE开发STM32程序时&#xff0c;编译报警告&#xff1a; warning: _close is not implemented and will always fail warning: _lseek is not implemented and will always…

顺序表在线OJ题(详解+图解)

1&#xff1a;原地移除数组中所有的元素val&#xff08;时间复杂度为O(N)空间复杂度为O(1)&#xff09; 题目的大概意思是&#xff1a;用户自行输入一个数组&#xff0c;还要输入一个val的整形值&#xff0c;然后从数组中移除等于val的元素 我们根据题目的要求&#xff0c;时间…

软件测试/人工智能丨深入人工智能软件测试:PyTorch引领新时代

在人工智能的浪潮中&#xff0c;软件测试的角色变得愈发关键。本文将介绍在人工智能软件测试中的一些关键技术&#xff0c;以及如何借助PyTorch深度学习框架来推动测试的创新与升级。 PyTorch&#xff1a;深度学习的引擎 PyTorch作为一种开源的深度学习框架&#xff0c;为软件…

成功解决 IDEA 2020 版本 代码报错不提示的几种方案

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 今天中午写代码的时候&#xff0c;ID…

项目文章:oxBS揭示复发性膀胱癌的DNA甲基化和羟甲基化变化并鉴定预测PD-L1表达标记物

近日&#xff0c;徐州市中心医院&#xff08;徐州医科大学徐州临床学院&#xff09;史振铎等为第一作者、韩从辉教授为通讯作者在《Biomarker Research》杂志发表题为“Integrative multi-Omics analysis depicts the methylome and hydroxymethylome of recurrent bladder can…

uni-app开发微信小程序 vue3写法添加pinia

说明 使用uni-app开发&#xff0c;选择vue3语法&#xff0c;开发工具是HBliuderX。虽然内置有vuex&#xff0c;但是个人还是喜欢用Pinia&#xff0c;所以就添加进去了。 Pinia官网连接 添加步骤 第一步&#xff1a; 在项目根目录下执行命令&#xff1a; npm install pinia …

外贸开发信主题怎么写?营销邮件标题推荐?

外贸开发信主题编写方法&#xff1f;如何用QQ邮件群发外贸邮件&#xff1f; 在外贸领域&#xff0c;写一封引人注目的开发信至关重要。外贸开发信主题应当吸引受众&#xff0c;引起兴趣&#xff0c;激发他们与您进一步合作的愿望。为了达到这个目标&#xff0c;蜂邮将探讨一些…

转行学习Java编程能学会吗?那些转行的人后来都怎么样了?

转行学习Java编程能学会吗?那些转行的人后来都怎么样了? 现在转行java编程的人群&#xff0c;就像考公考研的大军-样&#xff0c;看起来表面上是一个庞大的群体,但实际上 就跟考公考研的群体-样&#xff0c;其中有1/3的属于无准备&#xff0c;裸考就是陪跑的炮灰&#xff0c…

【已解决】启动SSH服务报“could not load host key”错误

文章目录 问题复现解决方案 问题复现 解决方案 yum remove openssh-* && yum install -y openssl openssh-server && systemctl restart sshd

【开源】基于JAVA的大学兼职教师管理系统

项目编号&#xff1a; S 004 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S004&#xff0c;文末获取源码。} 项目编号&#xff1a;S004&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管…

智慧汽车—城市NOA迎爆发

在特斯拉引领的 TransformerBev 架构驱动下&#xff0c;智驾算法趋近于端到端的智驾大模型&#xff0c;使得智能驾驶开始步入城市 NOA 新时代。 消费者认知增强&#xff0c;未来市场空间广阔。伴随城市 NOA 在 23-24 年的落地和普及、L3 法规在年内的落地&#xff0c;行业 0-1…

软件测试面试思路技巧和方法分享,学到就是赚到

面试技巧(不包含笔试部分)&#xff1a; 一、面试前&#xff1a; 投递简历的第一建议是海投&#xff0c;经验不足的情况下切记&#xff0c;不要挑三拣四。 个人建议面试的安排周期&#xff0c;一天最多两家&#xff0c;如果不着急&#xff0c;就安排一家。当面试安排时间发生冲突…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器 文章目录 无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

VirtualKD-Redux 双机调试内驱驱动

官网使用说明 官网下载地址 简单的说 1. 如果是64位虚拟机&#xff0c;把target64文件夹拷贝到虚拟机中&#xff0c;然后安装vminstall.exe 2. 我电脑是用windbg prview, 在主机上打开 vmmon64.exe 3 设置DbgX.Shell.exe路径 D:\安装\WinDbg Preview1.1910.3003.0\Microsoft…