洛谷P3370 【模板】字符串hash

链接:P3370


所谓模板题hash
hash主要是用来更好进行辨别
我们利用其它进制的值,把字符串的每一位定义成其他进制的一个值,从而一个N个字符的字符串都转化成了一个有N位的K进制的数值,这个数值将独一无二
但是我们在取K进制的时候需要进行鉴别,首先需要保证K进制要比任何一个字符你定义的值要相对大一些,还有是否需要进行%,也需要根据题目的实际情况,**这里模的值一定不能是合数,要取质数,**可以选择19261027但是我会更喜欢1e9+7这个质数进行%

代码:

#include 
#include 
#include 
#include 
#define ull unsigned long long
using namespace std;
ull a[100001],k1=1e9+7;
int k=131,n,tot;
char ch[100001];
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%s",ch);
		int l=strlen(ch)-1;
	    ull ans=1;
		for (int j=0;j<l;j++)
		{
			ans=(ans*k+(ull)ch[j])%k1;  //哈希转移具体体现,将一个n位的字符串转为n位的k进制数
		}
		a[i]=ans;
	}
	sort(a+1,a+n+1);  //进行排序更好去重
	for (int i=1;i<=n;i++)
	if (a[i]!=a[i+1])
	tot++;
	printf("%d",tot);
	return 0;
}

你可能感兴趣的:(哈希Hash)