#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N =1e5;
const int mod[]={19260817,19660813};
const int base[]={233,2333};
int Hash[2][N],f[2][N];
int idx;
int n;
struct dina{
int x, y ;
}node[2*N];
void initHash(string s){
int n=s.size();
Hash[0][0]=Hash[1][0]=0;
for(int j=0;j<2;j++){
for(int i=1;i<=n;i++) {
Hash[j][i]=(Hash[j][i-1]*base[j]+(s[i-1]-'a'+1))%mod[j];
}
}node[idx].x=Hash[0][n];
node[idx].y=Hash[1][n];
idx++;
}
bool cmp(const dina &t,const dina &q)
{
return t.x<q.x;
}
pair<int,int>getHash(int l,int r){
return make_pair((Hash[0][r]-(Hash[0][l-1]*f[0][r-l+1])%mod[0]+mod[0])%mod[0],
(Hash[1][r]-(Hash[1][l-1]*f[1][r-l+1])%mod[1]+mod[1])%mod[1]);
}
void init() {
f[0][0]=f[1][0]=1;
for(int j=0;j<2;j++) {
for(int i=1;i<N;i++) {
f[j][i]=f[j][i-1]*base[j]%mod[j];
}
}
}
signed main()
{ init();
// int t ;
cin>>n ;
int t =n ;
int ans= 1;
while(t--)
{
string s;
cin>>s;
initHash(s);
}sort(node,node+n,cmp);
for (int i=2;i<=n;i++)
if (node[i].x!=node[i-1].x || node[i-1].y!=node[i].y)
{
ans++;
}
printf("%lld\n",ans);
return 0 ;
}
双哈希模板(求所给字符串不一样的有多少个)
最新推荐文章于 2024-09-05 20:33:20 发布