P3370 【模板】字符串哈希

传送门

题目大意

求n个字符串不同的个数

题解

hash模板 1LL强制转换成long long

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set> 
#include<cstring>
using namespace std;
//#define mod 1e9+7//不能这样宏定义 
const int mod=1e9+7;
#define D 131
#define M 2333+7
long long n,g[M],f[M];
string s;
set<long long>t;
void predeal(int x){
    //memset(f,0,sizeof(f));
    //memset(g,0,sizeof(g));
    f[0]=s[0];
    for(int i=1;i<=x;i++)
        f[i]=(1LL*f[i-1]*D+s[i-1])%mod;
    g[0]=1;
    for(int i=1;i<=x;i++)
        g[i]=1ll*g[i-1]*D%mod;
}
int Hash(int l,int r){
    long long a=f[r],b=1LL*f[l-1]*g[r-l+1]%mod;
    return (a-b+mod)%mod; 
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>s;
        long long len=s.length();
        predeal(len);
        long long k=Hash(1,len);
        t.insert(k);
    }
    printf("%lld
",t.size());
    return 0;
}
原文地址:https://www.cnblogs.com/zzyh/p/7260311.html