字符串哈希-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;
}
posted @ 2017-03-16 10:21  largecube233  阅读(115)  评论(0编辑  收藏  举报