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

相关文章

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

交换机救命命令手册! 思科交换机排障命令汇总指南

《交换机救命命令手册!思科交换机排障命令汇总指南》在交换机配置与故障排查过程中,总会遇到那些“关键时刻靠得住的命令”,今天我们就来分享一份思科双实战命令手册... 目录1. 基础系统诊断2. 接口与链路诊断3. L2切换排障4. L3路由与转发5. 高级调试与日志6. 性能与QoS7. 安全与DHCP8.

故障定位快人一步! 华为交换机排障命令汇总

《故障定位快人一步!华为交换机排障命令汇总》在使用华为交换机进行故障排查时,首先需要了解交换机的当前状态,通过执行基础命令,可以迅速获取到交换机的系统信息、接口状态以及配置情况等关键数据,为后续的故... 目录基础系统诊断接口与链路诊断L2切换排障L3路由与转发高级调试与日志性能、安全与扩展IT人无数次实战

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

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.表格内容的