BZOJ3555 CTSC2014 企鹅QQ HASH+二分法
题意:给定N个字符串,求这N个字符串中有几对字符串有且仅有一位不同
题解:首先双哈希存下来,枚举删除哪一位,枚举每一个字符串删除后的哈希值,对哈希值排序之后看有多少个相同的,每组大小为n的相同字符串集对答案的贡献为$C_n^2$
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define ll long long const int P[]={137,233,213,133}; const int MAXL=200+2; const int MAXN=30000+2; int N,L,Q,ans; ll f[MAXN][MAXL],g[MAXN][MAXL],h[MAXN]; char S[MAXL]; void Hash(int x,char *S){ for(int i=1;i<=L;i++) f[x][i]=f[x][i-1]*P[0]+S[i]; for(int i=L;i;i--) g[x][i]=g[x][i+1]*P[1]+S[i]; } int main(){ scanf("%d %d %d",&N,&L,&Q); for(int i=1;i<=N;i++){ scanf("%s",S+1); Hash(i,S); } for(int i=1;i<=L;i++){ for(int j=1;j<=N;j++) h[j]=f[j][i-1]*P[2]+g[j][i+1]*P[3]; sort(h+1,h+N+1); for(int j=2,k=1;j<=N;j++) if(h[j]==h[j-1]) ans+=k++; else k=1; } printf("%d\n",ans); return 0; }