bzoj3555 [Ctsc2014]企鹅QQ——字符串哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3555
很久以前就讲过哈希,但一直没写过题,所以这是哈希第一题!
哈希就是把一个字符串映射成一个数,竟然还能排序!
参考了 hzwer 的博客,但为什么写出来比别人慢了一倍...
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int const maxn=30005,maxm=205; int n,m,tp,ans; ll f[maxn][maxm],g[maxn][maxm],tmp[maxn];//ll char ch[maxm]; void init(int x) { for(int i=1;i<=m;i++)f[x][i]=f[x][i-1]*137+ch[i]; for(int i=m;i;i--)g[x][i]=g[x][i+1]*149+ch[i]; } int main() { scanf("%d%d%d",&n,&m,&tp); for(int i=1;i<=n;i++){cin>>ch+1; init(i);} for(int j=1;j<=m;j++)//枚举每一位 { for(int i=1;i<=n;i++)//除这一位的每一个字符串 tmp[i]=f[i][j-1]*233+g[i][j+1]*213; sort(tmp+1,tmp+n+1); for(int i=2,nw=1;i<=n;i++) { if(tmp[i]==tmp[i-1])ans+=nw,nw++; else nw=1; } } printf("%d\n",ans); return 0; }