字符串hash
Posted PECHPO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串hash相关的知识,希望对你有一定的参考价值。
这个总结写的不错。。
思路比较简单,就是弄两个素数,然后搞一个base,根据base进制对字符串进行取模,搞出来两个数,然后比较时根据两个数来比较。只要有一个不同就是不同。
1 #include <cstdio> 2 #include <cstring> 3 #include <utility> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=1e5+5, maxm=1505; 8 const int seed=233; 9 const int p1=1e7+7, p2=1e9+7; 10 int n; 11 char s[maxm]; 12 pair<int, int> a[maxn]; 13 14 bool cmp(pair<int, int> a, pair<int, int> b){ 15 return a.first<b.first; 16 } 17 18 pair<int, int> get_hash(char *s){ 19 long long ans1=0, ans2=0; 20 for (int i=0; s[i]!=‘\0‘; ++i){ 21 ans1=(ans1*seed+s[i])%p1; 22 ans2=(ans2*seed+s[i])%p2; 23 } 24 return make_pair(ans1, ans2); 25 } 26 27 int main(){ 28 scanf("%d", &n); 29 for (int i=0; i<n; ++i){ 30 scanf("%s", s); 31 a[i]=get_hash(s); 32 } 33 sort(a, a+n, cmp); 34 int ans=1; //这里要是1,因为本来就有一个字符串。。 35 for (int i=1; i<n; ++i) 36 if (a[i].first!=a[i-1].first|| 37 a[i].second!=a[i-1].second) 38 ++ans; 39 printf("%d\n", ans); 40 }
#include<cstdio>
#include<cstring>
#include<utility>
#include<algorithm>
usingnamespacestd;
constintmaxn=1e5+5,maxm=1505;
constintseed=233;
constintp1=1e7+7,p2=1e9+7;
intn;
chars[maxm];
pair<int,int>a[maxn];
boolcmp(pair<int,int>a,pair<int,int>b){
returna.first<b.first;
}
pair<int,int>get_hash(char*s){
longlongans1=0,ans2=0;
for(inti=0;s[i]!=‘\0‘;++i){
ans1=(ans1*seed+s[i])%p1;
ans2=(ans2*seed+s[i])%p2;
}
returnmake_pair(ans1,ans2);
}
intmain(){
scanf("%d",&n);
for(inti=0;i<n;++i){
scanf("%s",s);
a[i]=get_hash(s);
}
sort(a,a+n,cmp);
intans=1;//这里要是1,因为本来就有一个字符串。。
for(inti=1;i<n;++i)
if(a[i].first!=a[i-1].first||
a[i].second!=a[i-1].second)
++ans;
printf("%d\n",ans);
}
以上是关于字符串hash的主要内容,如果未能解决你的问题,请参考以下文章
URL中的锚点(fragment片段标识符)是什么?(hash mark(#))(HTML 页面内定位)(之前学html不是学了吗?忘啦?)(SEO 搜索引擎优化)