搞了个双哈希
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define ULL unsigned long long
#define LL long long
#define MOD1 1000000007
#define MOD2 23333333333
#define base 131
using namespace std;
struct nico
{
ULL x,y;
}p[1505];
char s[1005][1505];
int n,ans;
ULL hash1(int x)
{
int i;
int len=strlen(s[x]);
ULL h=0;
for(i=0;i<len;i++)
h=(h*base+(ULL)s[x][i])%MOD1;
return h;
}
ULL hash2(int x)
{
int i;
int len=strlen(s[x]);
ULL h=0;
for(i=0;i<len;i++)
h=(h*base+(ULL)s[x][i])%MOD2;
return h;
}
bool comp(nico a,nico b)
{
return a.x<b.x;
}
int main()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",s[i]);
p[i].x=hash1(i);
p[i].y=hash2(i);
}
sort(p+1,p+n+1,comp);
for(i=1;i<=n;i++)
if(p[i].x!=p[i-1].x||p[i].y!=p[i-1].y) ans++;
printf("%d",ans);
return 0;
}