bzoj3555 [Ctsc2014]企鹅QQ
又是一道字符串哈希
这道题要求你求只差一位上的字母的字符串的对数。
观察范围
n=30000,L=200
n
=
30000
,
L
=
200
那就大力出奇迹就好了
暴力枚举哪一位不同就可以了
复杂度
O(NLlog2N)
O
(
N
L
l
o
g
2
N
)
随便跑无压力
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,L,S;
const int MAXN=30010,MAXL=210;
char s[MAXN][MAXL];
typedef unsigned long long gei;
const gei base=19260817;
gei _hash[MAXN],bin[MAXN],fafa[MAXN];
long long ans;
int top;
int main()
{
scanf("%d%d%d",&n,&L,&S);
bin[0]=1;
for(register int i=1;i<=L;i++)bin[i]=bin[i-1]*base;
for(register int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
for(register int j=1;j<=L;j++)
_hash[i]=_hash[i]*base+s[i][j];
}
for(register int i=1;i<=L;i++)
{
for(register int j=1;j<=n;j++)
fafa[j]=_hash[j]-s[j][i]*bin[L-i];
sort(fafa+1,fafa+n+1);
top=0;
for(register int j=1;j<=n;j++)
{
if(fafa[j]==fafa[j-1])++top;
else
{
ans+=(top-1)*top/2;
top=1;
}
}
ans+=(top-1)*top/2;
}
cout<<ans<<endl;
}