您的位置:首页 > 其它

字符串哈希-P3370 【模板】字符串哈希

2017-03-16 10:21 197 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: