P3370 【模板】字符串哈希

Toretto·2021-10-30 16:51·8 次阅读

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;
}

总结:

哈希的模板题并不多,更多的是实际运用,如同高精度运算,我们并不能只是刷刷模板,跟要在更多的题目中运用。
(反正我是没能熟练运用)

posted @   S·A·I  阅读(8)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示