哈希是一个非常常用的字符串的操作,最常见的是判断两个字符串是否相等。
判断两个字符串是否相等可以用暴力求解的方法,比如先判断两个字符串的长度,然后再枚举判断每一位,复杂度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 }
因为双哈希难被卡,所以我们就不提供双哈希的代码了