字符串哈希-P3370 【模板】字符串哈希
2017-03-16 10:21
197 查看
https://www.luogu.org/problem/show?pid=3370#sub
我并没有学过hash;
所以这一次字符串hash也是极好的弥补了我以前在hash上的空白;
比如一个字符串s;
我们要把他记录下来,并且对后面的字符串判重;
那我们就要给他一个标记;
我们搞一个BASE;
这个就是我们自己定的进制;
然后我们把字符串转换成这个就进制;
强制类型转换;
你看,sum就变成了一个数字;
那么我们就可以hash了啊;
当然,我们取不同的进制,不同的模,会有不同的结果;
BASE我取了233
mo是1e9+7;
我并没有学过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;
}
相关文章推荐
- [P3370][模板]字符串哈希
- P3370 [模板] 字符串哈希
- P3370 【模板】字符串哈希
- 洛谷——P3370 【模板】字符串哈希
- P3370 【模板】字符串哈希
- 洛谷 P3370 【模板】字符串哈希
- P3370 【模板】字符串哈希
- [模板]-字符串哈希
- P3370 【模板】字符串哈希
- 字符串哈希(Hash模板)
- 【模板】 字符串哈希
- 【模板】字符串哈希
- AC日记——【模板】字符串哈希 洛谷 3370
- 洛谷P3370 【模板】字符串哈希
- 字符串哈希模板
- 【模板】字符串哈希
- luogu P3370 【模板】字符串哈希
- 【字符串哈希】【BKDRhash】【Rabin-Karp算法】模板
- 【模板】【洛谷P3370】字符串哈希
- P3370 【模板】字符串哈希