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;
}
View Code

 

posted @ 2017-02-27 21:50  WDZRMPCBIT  阅读(125)  评论(0编辑  收藏  举报