这个写的不错。。
思路比较简单,就是弄两个素数,然后搞一个base,根据base进制对字符串进行取模,搞出来两个数,然后比较时根据两个数来比较。只要有一个不同就是不同。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn=1e5+5, maxm=1505; 8 const int seed=233; 9 const int p1=1e7+7, p2=1e9+7;10 int n;11 char s[maxm];12 pair a[maxn];13 14 bool cmp(pair a, pair b){15 return a.first get_hash(char *s){19 long long ans1=0, ans2=0;20 for (int i=0; s[i]!='\0'; ++i){21 ans1=(ans1*seed+s[i])%p1;22 ans2=(ans2*seed+s[i])%p2;23 }24 return make_pair(ans1, ans2);25 }26 27 int main(){28 scanf("%d", &n);29 for (int i=0; i
#include<cstdio>
#include
#include
#include
usingnamespacestd;
constintmaxn=1e5+5,maxm=1505;
constintseed=233;
constintp1=1e7+7,p2=1e9+7;
intn;
chars[maxm];
paira[maxn];
boolcmp(paira,pair b){
returna.first
}
pairget_hash(char*s){
longlongans1=0,ans2=0;
for(inti=0;s[i]!='\0';++i){
ans1=(ans1*seed+s[i])%p1;
ans2=(ans2*seed+s[i])%p2;
}
returnmake_pair(ans1,ans2);
}
intmain(){
scanf("%d",&n);
for(inti=0;i
scanf("%s",s);
a[i]=get_hash(s);
}
sort(a,a+n,cmp);
intans=1;//这里要是1,因为本来就有一个字符串。。
for(inti=1;i
if(a[i].first!=a[i-1].first||
a[i].second!=a[i-1].second)
++ans;
printf("%d\n",ans);
}