字符串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 long
using 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;
}