What the Hash of String is?
核心思想
就是一个单向加密系统
字符串Hash其实有点类似于银行的2048位加密系统,唯一的区别应该是字符串Hash是单向加密。
具体思路
定义一个实数集
对于已知的每一个存在于字符集
都有一个
一般来说,我们定义
(感觉我好像说的有点模糊)
举个栗子:
有下列字符串:
那么字符集
所以你可以写一个5进制转10进制的简单程序来充当
值得注意的是,由于
对于
For Example
定义
那么根据这个方程得出来的ab和ba两个字符串的
So,字符串Hash其实是有一定的错误率的
所以,选择一个相对较好的进制数base可以尽可能让你的错误率趋近于0
绝大多数情况下,不要选择一个
最稳妥的办法是选择两个
如果能背过或在考场上找出一个
偷懒的写法就是直接使用unsigned long long,不手动进行取模,它溢出时会自动对
最后放个代码纪念一下字符串专题的开始(我最最最起码还有KMP没学)
#include<bits/stdc++.h>
using namespace std;
int n,ans,base=19260817;
unsigned long long f[10001];
string s;
void Hash(string a,int p){
for(int i=0;i<a.length();i++) f[p]=f[p]*base+int(s[i]);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
Hash(s,i);
}
sort(f+1,f+n+1);
for(int i=0;i<n;i++)
if(f[i]!=f[i+1]) ans++;
cout<<ans<<endl;
}