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

2024-09-01 11:04

本文主要是介绍nefu暑假集训4 哈希 个人模板+例题汇总,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

  什么是哈希?哈希其实是所有字符串操作中,最简单的操作了(哈希的过程,其实可以看作对一个串的单向加密过程,并且需要保证所加的密不能高概率重复(就像不能让隔壁老王轻易地用它家的钥匙打开你家门一样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;
}

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

后记:

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

这篇关于nefu暑假集训4 哈希 个人模板+例题汇总的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126751

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3