#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL unsigned long long
using namespace std;
LL Hash[30005];
char s[30005][205];
int n,L,k;
int num(char c)
{
if(c>='A'&&c<='Z')
return c-'A'+1;
if(c>='a'&&c<='z')
return c-'a'+27;
if(c>='0'&&c<='9')
return c-'0'+53;
if(c=='_') return 63;
if(c=='@') return 64;
}
void get(int x)
{
for(int i=0;i<L;i++)
{
Hash[x]*=67;
Hash[x]+=num(s[x][i]);
}
}
LL S[205];
LL hash[30005];
void cut(int x,int p)
{
hash[x]=Hash[x];
hash[x]-=num(s[x][p])*S[p];
}
int main()
{
scanf("%d%d%d",&n,&L,&k);
S[L-1]=1;
for(int i=L-2;i>=0;i--)
S[i]=S[i+1]*67;
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
get(i);
}
LL ans=0;
for(int l=0;l<L;l++)
{
for(int i=1;i<=n;i++)
cut(i,l);
sort(hash+1,hash+n+1);
int cnt=1;
for(int i=2;i<=n;i++)
{
if(hash[i]==hash[i-1])
{
ans+=(LL)cnt;
cnt++;
}
else cnt=1;
}
}
cout<<ans;
}
CTSC2014 企鹅QQ Hash模板
最新推荐文章于 2018-09-16 08:46:00 发布