字符串hash初步是讨论如何用一个整数唯一的表示一个字符串的问题。
首先来看这么一个问题:如何将一个二维整点坐标P(x,y)用一个整数唯一的表示?(其中0≤x,y≤range)
很容易想到的是 整数=x*range+y。
回到字符串hash初步讨论的问题上,想想它的解决方案:
我们不妨设字符串S由A~Z这26个大写字母组成,再不妨把A~Z映射为0~25,这样就可以把26个字母对应到二十六进制中。
接着,按照二十六进制转换成十进制的方法,即可将这个S转换成一个十进制的数。由进制转换的结论可以知道,这个十进制的数是唯一的,于是上述问题得到解决,下面是实现:
(小写字母与之类似)
int hashFunc1(char s[],int len) { int id=0; for(int i=0;i<len;i++) { id=id*26+(s[i]-'A'); } return id; }
int hashFunc2(char s[],int len) { int id=0; for(int i=1;i<len;i++) { if(s[i]>='A'&&s[i]<='Z') id=id*52+(s[i]-'A'); else if(s[i]>='a'&&s[i]<='z') id=id*52+(s[i]-'a')+26;///注意加26,否则输出的值与大写字母相同 } }
若给n个字符串(恰好由三位大写字母组成),再给出m个询问字符串,问该字符串出现过几次
#include <bits/stdc++.h> using namespace std; const int maxn=100; char s[maxn][5],temp[5]; int hashtable[26*26*26+10]; int hashFunc(char s[],int len) { int id=0; for(int i=0;i<len;i++) { id=id*26+(s[i]-'A'); } return id; } int main() { int n,m; cin>>n>>m; for(int i=0;i<n;i++) { scanf("%s",s[i]); int id=hashFunc(s[i],3); hashtable[id]++; } for(int i=0;i<m;i++) { cin>>temp; int id=hashFunc(temp,3); cout<<hashtable[id]<<endl; } return 0; }