P3370 【模板】字符串哈希
题目大意:
解题思路:
根据题目 根据分析,我们考虑字符串哈希。
字符串哈希就是赋予字符串一个独有的哈希值,主要作用就是用来判重。
这里简单阐述一种常用的字符串哈希法:
首先,将一个字符串视为一个P进制数(P一般取133331,我喜欢5418666,别问我为什么),然后将这个P进制的字符串转为十进制数,这个数就是这个字符串的哈希值。
很显然,如果P过大,这个字符串的哈希值肯定是高精度的,那么哈希就没有意义了。因此我们要对这个大哈希值进行取模,一般将这个值压缩到我们的 unsigned long long 的范围内。
显然,为了判重,最快的方法是桶排,如果哈希值过大,内存不支持将这种值进行桶排,因此我们还得二次取模,使这个数到达桶排可接受的 1 ~ 1e8 的范围内,(这个二次模数是判断一个哈希好不好的关键,我一般取 11451419 或 98244357,因为这两个数字很臭)
哈希打完了,那么这道题就迎刃而解了。
CODE:
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int P=5418666;
string ha="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
ull hsh(string x)
{
ull s=0;
for(int i=0;i<x.size();i++)
s=s*P+ha.find(x[i]); //将字符串映射为P进制数,利用数据过大溢出的特点自动取模,避免低效的MOD运算
s=s%98244357; //二次取模
return s;
}
bool vis[98244358]={false};
int main()
{
int n,ans;
cin>>n;
ans=n;
string a;
for(int i=1;i<=n;i++)
{
cin>>a;
if(vis[hsh(a)]) ans--;
else vis[hsh(a)]=true;
}
cout<<ans;
return 0;
}
总结:
哈希的模板题并不多,更多的是实际运用,如同高精度运算,我们并不能只是刷刷模板,跟要在更多的题目中运用。
(反正我是没能熟练运用)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!