字符串哈希
字符串哈希
首先看一个比较特殊的字符串匹配问题:在很多字符串中尽快操作某个字符串。如果字符串的规模很大,访问速度很快速。这个问题用哈希(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;
}

浙公网安备 33010602011771号