字符串哈希-P3370 【模板】字符串哈希
https://www.luogu.org/problem/show?pid=3370#sub
我并没有学过hash;
所以这一次字符串hash也是极好的弥补了我以前在hash上的空白;
比如一个字符串s;
我们要把他记录下来,并且对后面的字符串判重;
那我们就要给他一个标记;
我们搞一个BASE;
这个就是我们自己定的进制;
然后我们把字符串转换成这个就进制;
强制类型转换;
int sum=0;
for(int i=0;i<s.length();i++)sum=sum*233+s[i];
sum=(sum%mo+mo)%mo;
你看,sum就变成了一个数字;
那么我们就可以hash了啊;
当然,我们取不同的进制,不同的模,会有不同的结果;
BASE我取了233
mo是1e9+7;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#define Ll long long
using namespace std;
int n,x,ans,mo=13131,ll;
int nxt[131310],head[13131];
string s,v[100000];
bool ok(string s){
int sum=0;
for(int i=0;i<s.length();i++)sum=sum*233+s[i];
sum=(sum%mo+mo)%mo;
for(int k=head[sum];k;k=nxt[k])
if(v[k]==s)return 0;
v[++ll]=s;
nxt[ll]=head[sum];
head[sum]=ll;
return 1;
}
int main()
{
scanf("%d",&n);
while(n--){
cin>>s;
if(ok(s))ans++;
}
cout<<ans;
}