字符串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]!=''; ++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
", 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]!='';++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
",ans);
}

原文地址:https://www.cnblogs.com/MyNameIsPc/p/7476834.html