双哈希30pts求查错
查看原帖
双哈希30pts求查错
127299
Young_Zn_Cu楼主2020/12/4 18:41
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=10005;
const int Mod1=1e9+7;
const int Mod2=998244353;
const int base1=2333;
const int base2=107;
int n;
char s[N];
struct node{ll ke1,ke2;}a[N];
inline void work1(int k,int len){for(int i=1;i<=len;++i) a[k].ke1=(a[k].ke1+((ll)s[i]*base1)%Mod1)%Mod1;}
inline void work2(int k,int len){for(int i=1;i<=len;++i) a[k].ke2=(a[k].ke2+((ll)s[i]*base2)%Mod2)%Mod2;}
inline bool cmp(node a,node b){if(a.ke1!=b.ke1)return a.ke1<b.ke1;return a.ke2<b.ke2;}
inline int read(){
	int cnt=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)){cnt=(cnt<<3)+(cnt<<1)+(c^48);c=getchar();}
	return cnt*f;
}
signed main(){
	n=read();
	for(int i=1;i<=n;++i){
		scanf("%s",s+1);
		int len=strlen(s+1);
		work1(i,len);work2(i,len);
	}
	sort(a+1,a+1+n,cmp);
	int tot=n;
	for(int i=2;i<=n;++i) if(a[i-1].ke1==a[i].ke1&&a[i-1].ke2==a[i].ke2) --tot;
	printf("%d\n",tot);
	return 0;
}
2020/12/4 18:41
加载中...