nefu暑假集训4 哈希 个人模板+例题汇总

news2024/11/15 19:26:54

前言:

  什么是哈希?哈希其实是所有字符串操作中,最简单的操作了(哈希的过程,其实可以看作对一个串的单向加密过程,并且需要保证所加的密不能高概率重复(就像不能让隔壁老王轻易地用它家的钥匙打开你家门一样qwq),通过这种方式来替代一些很费时间的操作。 比如,最常见的,当然就是通过哈希数组来判断几个串是否相同(洛谷P3370)。此处的操作呢,很简单,就是对于每个串,我们通过一个固定的转换方式,将相同的串使其的“密”一定相同,不同的串 尽量 不同。 此处有人指出:那难道不能先比对字符串长度,然后比对ASCLL码之和吗?事实上显然是不行的(比如ab和ba,并不是同一个串,但是如是做却会让其认为是qwq)。这种情况就叫做hash冲突,并且在如此的单向加密哈希中,hash冲突的情况在所难免(bzoj就有这种让你给出一组样例,使得一段哈希代码冲突的题,读者可以尝试尝试)

下面我给出这个暑假训练时写过的hash的题。

正文:

链接:字符串哈希及kmp专题 - Virtual Judge (vjudge.net)

模板:

//预处理
pow1[0] = 1;
for (int i = 1; i <= n; i++)
pow1[i] = pow1[i - 1] * Base1 % mod;
for (int i = 1; i <= n; i++)
{
ha1[i] = (ha1[i - 1] * Base1 + s[i]) % mod;
}
//查询
long long get_hash(int l, int r)
{
long long res1 = ((ha1[r] - ha1[l - 1] * pow1[r - l + 1] % mod) + mod) %
mod;
return res1;
}

习题:

A - 字符串哈希:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull base=131;
ull a[10005];
char s[10005];
int n;
ull mod=1e9+7;
ull gethash(char s[]){
	int len=strlen(s);
	ull ans=0;
	for(int i=0;i<len;i++){
		ans=(ans*base+(ull)s[i])%mod;
	}
	return ans;
}
int main(){
	int ans=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",s);
		a[i]=gethash(s);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<n;i++){
		if(a[i]!=a[i+1])ans++;
	}
	cout<<ans<<endl;
	return 0;
}

哈希的模板题。

B - Barn Echoes G:

#include<bits/stdc++.h>
using namespace std;
int main(){	
    string a,b;
    cin>>a>>b;
    int n=min(a.size(),b.size());
    int i,j;
    for(i=n;i>=1;i--){
    	if(a.substr(0,i)==b.substr(b.size()-i,i))break;
	}	
    for(j=n;j>=1;j--){
    	if(b.substr(0,j)==a.substr(a.size()-j,j))break;	
	}
    cout<<max(i,j)<<endl; 
    return 0;
} 

这题我没用hash(懒),不过hash的思路还挺简单的,就是第一个字符串的前缀的区间哈希值和第二个字符串的后缀的区间哈希值或第二个字符串的前缀的区间哈希值和第一个字符串的后缀的区间哈希值比较一下,取最大值就完了。我这边直接用substr其实意思是一样的。

C - 单词背诵:​​​​​​​

#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
map<string,bool> f;
string s[100005];
int main(){
	int n,m;
	cin>>n;
	for(int i=1;i<=n;i++){
		string x;
		cin>>x;
		f[x]=true;
	}
	cin>>m;
	int l=1,ans,res;
	for(int i=1;i<=m;i++){
		cin>>s[i];
		if(f[s[i]])mp[s[i]]++;
		if(mp[s[i]]==1)ans++,res=i-l+1;
		while(l<=i){
			if(!f[s[l]]){
				l++;
				continue;
			}
			if(mp[s[l]]>=2){
				mp[s[l]]--,l++;
				continue;
			}
			break;
		}
		res=min(res,i-l+1);
	}
	cout<<ans<<endl;
	cout<<res<<endl;
	return 0;
}

这题我也没用hash,直接用map来搞定映射关系了,想要用hash的直接用我第一题的hash写进去代替map中的string就行了。

D - A-B 数对:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
long long a[N];
map<int,int> mp;
int main(){
	long long n,m;
	long long ans=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mp[a[i]]++;
	}
	for(int i=1;i<=n;i++){
		ans+=mp[a[i]+m];	
	}
	cout<<ans<<endl;
	return 0;
}

这也算hash吗,map直接秒了。

E - 密文搜索:​​​​​​​

#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
int base=131;
int t[128],a[200001];
int change(){
	int cnt=1;
	for(int i='a';i<='z';i++)
	cnt=cnt*base+t[i];
	return cnt;
}
signed main()
{
    int len,n,ans=0;
    string s,s1;
	cin>>s>>n;
	len=s.size();
	for(int i=0;i<=len-8;i++)
	{
		memset(t,0,sizeof t);
		for(int j=i;j<i+8;j++)
		t[s[j]]++;
		a[i]=change();
	}
	memset(t,0,sizeof t);
	while(n--)
	{
		memset(t,0,sizeof t);
		cin>>s1;
		for(int j=0;j<8;j++)
		t[s1[j]]++;
		int b=change();
		for(int i=0;i<=len-8;i++)
		if(b==a[i]) ans++;
	}
	cout<<ans<<endl;
}

由于密码可能是被打乱的,所以我们需要规定一种hash可以直接找到一个合理的映射规则且不会产生冲突,我们可以根据字符序来规定hash的进制,这样就完美解决了这个问题。

I - 不重复数字:​​​​​​​

#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
inline int read(){
	char c=getchar();int x=0,f=1;
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=x*10+c-48;
	return x*f;
}
int T,n,x;
unordered_map<int,bool>s;
void work()
{
	s.clear();
	n=read();
	For(i,1,n){
		x=read();
		if(!s[x]){
			printf("%d ",x);
			s[x]=1;
		}
	}puts("");
}
int main(){
	T=read();
	while(T--)work();
	return 0;
}

这题更是没什么好说的了,写法很多。

后记:

  要开学了,新学期新气象,继续努力吧!

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

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

相关文章

室分(室内分布系统)主要器件

室分&#xff0c;即室内分布系统&#xff0c;是一种将基站信号引入室内&#xff0c;并对信号进行分布和覆盖的系统。它主要用于解决室内通信信号覆盖不足的问题&#xff0c;提高室内通信质量。室分系统通常由信号源、传输系统、分布系统和天线等部分组成&#xff0c;可以实现对…

java计算机毕设课设—JSP企业快信系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; java计算机毕设课设—JSP企业快信系统(附源码、文章、相关截图、部署视频) 详细的资源获取方式在最下方 JSP企业快信系统是一款专为企业内部及外部通信设计的小型企业通信软件&#xff0c;旨在解决企业在日常沟通中遇到的信息传递不及时、沟通不畅…

火绒安全与国际对手:全面对比与分析

目录 一、产品功能与技术特性对比 火绒安全 360安全卫士 卡巴斯基安全软件 二、市场表现与用户评价 火绒安全 360安全卫士 卡巴斯基安全软件 三、未来挑战与发展 技术与服务对比表格 结语 在数字化时代&#xff0c;网络安全成为了个人和企业面临的主要挑战之一。随着…

数学建模强化宝典(4)fminunc

一、介绍 fminunc 是 MATLAB 中用于求解无约束多变量非线性优化问题的函数。它尝试找到给定函数的最小值点&#xff0c;不需要用户提供函数的导数信息&#xff08;尽管如果提供了导数信息&#xff0c;算法通常会更快更准确地收敛&#xff09;。fminunc 使用的是拟牛顿法&#x…

stm32 8080时序驱动lcd屏幕

PSAM使用的硬件接口 PSAM读时序 PSAM写时序 相关时序 PSAM_RCRx NOR 和PSRAM控制寄存器

Ubuntu/Debian 上删除未使用的软件包

随着时间的推移&#xff0c;Linux 系统可能会有大量不再使用的软件包。这些软件包会占用大量磁盘空间&#xff0c;并可能降低系统的整体性能。 本指南将向您展示如何轻松地删除这些未使用的包。保持系统的干净和高效是很重要的&#xff0c;但是要小心&#xff0c;删除必要的软…

Kafka如何保证消息不丢失?

目录 Producer Broker Consumer 为什么Kafka没办法100%保证消息不丢失呢&#xff1f; 生产者 消费者 Broker Kafka作为一个消息中间件&#xff0c;他需要结合消息生产者和消费者一起才能工作&#xff0c;一次消息发送包含以下是三个过程&#xff1a; 1&#xff09;Prod…

QT实现电子相册

使用带有UI界面的QWidget实现电子相册 1、实现功能 1、定时器的使用&#xff0c;在当前页面的停止总时长。 2、显示当前时间 3、图片的上一张与下一张 4、图片的显示 5、进度展示、一共十张图片、进度条的初始值为10。 2、widget.h #ifndef WIDGET_H #define WIDGET_H#i…

Linux 常用命令 ulimit、uptime、curl、scp、dos2unix 提升开发和运维效率

Linux 常用命令&#xff1a;从资源限制到网络传输 一、前导&#xff1a;概述二、ulimit 用户资源三、uptime 机器启动时间负载四、curl 命令五、scp 远程拷贝六、dos2unix和unix2dos命令七、总结 一、前导&#xff1a;概述 本系列主要讲解Linux运行时命令&#xff0c;包括网络…

pycharm中opencv-python和opencv-contrib安装及测试相机链接取图

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python当前下载的是4.10.0 2.分别下载。 3.下载完后&#xff0c;打开pycharm&#xff0c;然后新建一个项目&#xff0c;项目中新建一个main.py文件&#xff0c;设置项目配置环境为当前python环境&#xff0c; …

常用排序算法(上)

目录 前言&#xff1a; 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3 常见的排序算法 2.常见排序算法的实现 2.1 堆排序 2.1 1 向下调整算法 2.1 2 建堆 2.1 3 排序 2.2 插入排序 2.1.1基本思想&#xff1a; 2.1.2直接插入排序&#xff1a; 2.1.3 插…

JS设计模式之“神奇的魔术师” - 简单工厂模式

引言 在JavaScript开发中&#xff0c;我们经常需要创建和管理各种对象&#xff0c;而简单工厂模式就是一种最简单的用来创建对象的设计模式。 简单工厂模式通过一个工厂类来创建相似的对象&#xff0c;而无需直接使用具体类来实例化对象。这样可以将对象的创建过程与使用过程…

Zabbix 配置win系统登录和钉钉告警

1、配置win监控项 win系统日志ID 4624是成功登录 4625是失败登录 登录成功日志&#xff1a; eventlog[Security,,"Success Audit",,^4624$,,skip] 登录失败日志&#xff1a; eventlog[Security,,"Success Audit",,^4625$,,skip] 要监控登录的日志&…

音视频开发之旅(90)-Vision Transformer论文解读与源码分析

目录 1.背景和问题 2.Vision Transformer(VIT)模型结构 3.Patch Embedding 4.实现效果 5.代码解析 6.资料 一、背景和问题 上一篇我们学习了Transformer的原理&#xff0c;主要介绍了在NLP领域上的应用&#xff0c;那么在CV(图像视频)领域该如何使用&#xff1f; 最直观…

在Diffusers中使用LoRA微调模型

在浏览稳定扩散模型共享网站&#xff08;例如 CivitAI&#xff09;时&#xff0c;你可能遇到过一些标记为“LoRA”的自定义模型。“LoRA”到底是什么—它与典型的模型检查点有何不同&#xff1f;LoRA 可以与Diffusers包一起使用吗&#xff1f;在本文中&#xff0c;我们将回答这…

计算机视觉基础 2. 滤波器

1. 简介 模糊滤波器是低通滤波器。它们从图像中去除高空间频率内容&#xff0c;只留下低频空间分量。结果是图像失去了细节&#xff0c;看起来很模糊。图像模糊在计算机图形学和计算机视觉中有许多应用。它可用于降低噪声&#xff08;如图17.1所示&#xff09;&#xff0c;揭示…

代码时光机:Git基础速成

hello,家人们,今天咱们来介绍Git以及Git相关的操作,好啦,废话不多讲,开干. 1:Git初识 在介绍Git前,博主首先讲一个小故事. 我们学计算机的小伙伴们,在学校里头都有实验课,那么老师呢就会要求我们写实验报告并且要求我们交上去给老师检查.有一个学计算机的大学生,名字叫张三,然…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task2:自适应学习率,分类

1.自适应学习率 临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。很多时候训练网络&#xff0c;损失不再下降&#xff0c;不是因为到了临界点&#xff0c;而是可能在山谷之间不停震荡。 以下为不同学习率对训练的影响&#xff0c;下图中左右平缓&#xff0c;上下陡…

C语言 | Leetcode C语言题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int firstUniqChar(char* s) {struct hashTable* position NULL;int que[26][2], left 0, right 0;int n strlen(s);for (int i 0; i < n; i) {int ikey s[i];struct has…

火语言RPA流程组件介绍--浏览选择文件夹

&#x1f6a9;【组件功能】&#xff1a;打开浏览文件夹选择对话框 配置预览 配置说明 对话框标题 支持T或# 打开浏览文件夹对话框时显示的标题。 默认打开文件夹 支持T或# 打开浏览文件夹对话框时&#xff0c;默认打开此文件夹。 取消后终止流程 “是”、“否”2种供选择…