【模板】字符串哈希

我对于字符串哈希的理解。。。可能就是一个神奇的函数把一个字符串转化成一个数吧(

hy:比如说现在有一个字符串orzc 枚举这个字符串的每一位,与base相乘得到ans,然后mod一下,就得到orzc的哈希值

这只是字符串哈希的一种写法……(这种写法正确性客观来说是非常高的)

也就是说哈希函数是可以自己定义的。

这里用到的是自然溢出。计算机内部是怎么处理自然溢出的大概不在我们的学习范围内……??

自然溢出大概是指-->(unsigned long long)在超出存储的最大上限之后会以某种玄学的方式自动(mod)掉某数……

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define MAXN 10005
#define base 107
#define scanf(a) scanf("%lld",&a)
#define print(a) printf("%lld",a)
#define printn(a) printf("%d
",&a);
using namespace std;
long long n,m;
int f[MAXN];
unsigned long long hash(string s)
{
	unsigned long long ans=0,len=s.size();
	for (long long i=0;i<len;i++)
	{
		ans=base*ans+(unsigned long long)s[i];
	}
	return ans;
}
void init()
{
	scanf(n);
	string s;
	for (long long i=1;i<=n;i++)
	{
		cin>>s;
		f[i]=hash(s);
	}
	sort(f+1,f+n+1);
}
void start()
{
	long long ans=0;
	for (int i=1;i<=n;i++)
	{
		if (f[i]!=f[i-1])
		{
			ans++;
		}
	}
	print(ans);
}
int main()
{
	init();
	start();
	return 0;
}
原文地址:https://www.cnblogs.com/Kan-kiz/p/10642019.html