字符串--哈希

哈希是一个非常常用的字符串的操作,最常见的是判断两个字符串是否相等。

判断两个字符串是否相等可以用暴力求解的方法,比如先判断两个字符串的长度,然后再枚举判断每一位,复杂度O(n)。

可是这样的复杂度你能忍受吗?我们有没有比较更优的方法呢?

下面就是我们要介绍的方法:哈希

哈希是将一个字符串上的每一位字符映射成一个一个的权值的做法。做法的大致流程很简单,首先设一个进制数base,并设一个模数mod,而哈希其实就是把一个数转化为一个值,这个值是base进制的,储存在哈希表中,注意一下在存入的时候取模一下即可。比如说现在有一个字符串orzc,枚举这个字符串的每一位,与base相乘得到ans,然后mod一下,就得到orzc的哈希值

但是这个方法有一个弊端,哈希冲突

何为哈希冲突?比如说ab,ba,他们映射之后的哈希值是一样的。我们减少哈希冲突的方法也有很多,比如自然溢出,双模数哈希。

下面就推荐一道哈希的模板题

下面是这道题的单哈希的AC代码

 

 1 #include<bits/stdc++.h>
 2 #define ull unsigned long long
 3 using namespace std;
 4 char s[2000];
 5 ull a[10001];
 6 int n,sum;
 7 ull hashe(const char *str)
 8 {
 9     ull hash=0;
10     ull seed = 19260817;
11     while(*str)
12         hash = hash*seed+(*str++);
13     return (hash % 1000000007);
14 }
15 int main()
16 {
17     cin >> n;
18     for(int i=1; i<=n; i++)
19     {
20         cin >> s;
21         int ans=hashe(s);
22         a[i]=ans;
23     }
24     sort(a+1,a+1+n);
25     for(int i=1; i<=n; i++)
26         if(a[i]!=a[i+1])
27             sum++;
28     cout<<sum;
29 }
View Code

 

因为双哈希难被卡,所以我们就不提供双哈希的代码了

posted @ 2018-08-03 15:44  _Lancy  阅读(254)  评论(0编辑  收藏  举报