贴代码跑,19260817,19660813.
Hash(i)=Σ s[i]*(base^len-i+1);
所以子区间的哈希值 Hash(l,r)=hash[r]-hash[l-1]*base^(r-l+1);
#include<bits/stdc++.h>
using namespace std;
const int MOD1=19260817;
const int MOD2=19660813;
const int base=87;
const int base2=54;
char s[3000];
struct data{
int x,y;
}n[10005];
int hash1(){
int ans=0;
int len=strlen(s);
for(int i=0;i<len;i++){
ans=(ans*base+s[i])%MOD1;
}
return ans;
}
int hash2(){
int ans=0;
int len=strlen(s);
for(int i=0;i<len;i++){
ans=(ans*base2+s[i])%MOD2;
}
return ans;
}
bool cmp(data a,data b){
return a.x<b.x;
}
int main(){
int t,output=0;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%s",s);
n[i].x=hash1();
n[i].y=hash2();
}
sort(n+1,n+1+t,cmp);
output++;
for(int i=2;i<=t;i++){
if(n[i].x!=n[i-1].x||n[i].y!=n[i-1].y)output++;
}
printf("%d\n",output);
}