字符串哈希

来源:互联网 发布:淘宝店怎么设置折扣价 编辑:程序博客网 时间:2024/04/28 14:42

字符串hash一种玄学的技巧
递推公式:H[i]=H[i+1]*x+s[i] (H[len]=0)
预处理出H数组后,求i~j的长度为L的哈希值,有公式:H[i]-H[j+1]*x^L
一般情况下,我们用map存hash值(曲神表示map只存数字的话不会被卡)
用ull存hash值,这样直接%2^64,比较快
如果不放心,可以选一个大质数%一下(1e9+7,998244353)

//这里写代码片#include<cstdio>#include<cstring>#include<iostream>#include<map>#define ll unsigned long longusing namespace std;const ll x=131;int n,ans; char s[2000];map<ll,int> S;int hash(char *s){    ll a=0;    int len=strlen(s);    for (int i=len-1;i>=0;i--)        a=a*x+s[i];    if (S.count(a)) return 0;    S[a]=++ans;}int main(){    scanf("%d",&n);    ans=0;    S.clear();    for (int i=1;i<=n;i++)    {        scanf("%s",s);        hash(s);    }    printf("%d",ans);    return 0;}
原创粉丝点击