字符串哈希

字符串哈希

首先看一个比较特殊的字符串匹配问题:在很多字符串中尽快操作某个字符串。如果字符串的规模很大,访问速度很快速。这个问题用哈希(hash)方法解决是最快的。用哈希函数对每个子串进行哈希,分别映射到不同的数字,即一个整数哈希值,然后就可以根据哈希值找到子串,接下来配合使用数据结构或STL完成判重、统计、查询等操作。哈希函数是其中的核心。在信息学竞赛中,最经典的就是进制哈希(BKDRHash函数),求得的哈希值几乎不会冲突碰撞。进制哈希的核心便是给出一个固定进制base,将一个串的每一个元素看做一个进制位上的数字,所以这个串就可以看做一个base进制的数,那么这个数就是这个串的哈希值;则我们通过比对每个串的的哈希值,即可判断两个串是否相同.

BKDRHash参考代码:(这份代码是在n个字符串中找出有几个不同的字符串 原题

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long qaq;
const qaq jinzhi=131;//要哈希成几进制数 131 和 13331 都可的
const int N = 10001;
qaq h[N];//hash出的数
int n,i;
char s[N];
int ans=1;//答案(不管怎样肯定有1个
qaq Hash(char *str)
{
	qaq k=0;
	while(*str)
	{
		k=k*jinzhi+(*str++);//哈希
	}
	return k;//返回哈希值
}
int main() {
	cin>>n;
	for(int i=0; i<n; i++) {
		cin>>s;
		h[i] = Hash(s);
	}
        sort(h,h+n);//排序好比较
	for(i=1;i<n;i++)
	if(h[i]!=h[i-1])ans++;
	cout<<ans;//输出
	return 0;
}

posted @ 2021-08-24 10:03  Hi_Kou  阅读(71)  评论(0)    收藏  举报