单哈希
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll d=470001;
char ss[10010];
ll hx[10010];
ll gethash(char s[])
{
ll ans=0;
for(int i=0;i<strlen(s);i++)
ans=(ans*d+(ll)(s[i]))%mod;
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,k=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",ss);
hx[i]=gethash(ss);
}
sort(hx+1,hx+n+1);
ll ans=1;
for(int i=2;i<=n;i++)
if(hx[i]!=hx[i-1])ans++;
printf("%d\n",ans);
return 0;
}
双哈希
#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const ll D1=772001;
const ll D2=772003;
const ll MOD1=1e9+7;
const ll MOD2=1e9+9;//以上是常用孪生素数
char ss[10010];
struct node{
ll hash1,hash2;
}a[10010];
ll make_hash1(char s[])
{
ll ans=0;
for(int i=0;i<strlen(s);i++)
ans=(ans*D1+(ll)(s[i]))%MOD1;
return ans;
}
ll make_hash2(char s[])
{
ll ans=0;
for(int i=0;i<strlen(s);i++)
ans=(ans*D2+(ll)(s[i]))%MOD2;
return ans;
}
bool cmp(const node&a,const node&b)
{
return a.hash1<b.hash1;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",ss),a[i].hash1=make_hash1(ss),a[i].hash2=make_hash2(ss);
sort(a+1,a+n+1,cmp);
int ans=1;
for(int i=2;i<=n;i++)
if(a[i].hash1!=a[i-1].hash1||a[i].hash2!=a[i-1].hash2)ans++;
printf("%d",ans);
return 0;
}