Luogu P4503 [CTSC2014]企鹅QQ

Link
预处理一下每个串从左往右和从右往左的哈希值。
然后枚举忽略的是哪一位,然后计算出每个串在忽略这一位下的哈希值。
接下来就是要计算有多少对哈希值相同的串,可以通过排序/哈希等方法解决。

#include<cstdio>
#include<algorithm>
using std::sort;
using u64=unsigned long long;
const int N=30007,M=207;
char s[M];int n,l,S;
u64 a[N],hl[N][M],hr[N][M];
void hash(int id)
{
    for(int i=1;i<=l;++i) hl[id][i]=hl[id][i-1]*233+s[i];
    for(int i=l;i>=1;--i) hr[id][i]=hr[id][i+1]*235+s[i];
}
int main()
{
    scanf("%d%d%d",&n,&l,&S);int ans=0;
    for(int i=1;i<=n;++i) scanf("%s",s+1),hash(i);
    for(int j=1;j<=l;++j)
    {
        for(int i=1;i<=n;i++) a[i]=hl[i][j-1]*237+hr[i][j+1]*239;
        sort(a+1,a+1+n);
	for(int i=2,p=1;i<=n;++i) a[i]==a[i-1]? ans+=p++:p=1;
    }
    printf("%d",ans);
}
posted @ 2020-01-21 10:35  Shiina_Mashiro  阅读(129)  评论(0编辑  收藏  举报