@ysner
2018-06-09T12:21:04.000000Z
字数 1004
阅读 2611
字符串 哈希
给出个长度为的字符串。问有多少对字符串去掉同一位后完全相同?
显然的暴力。
(枚举去掉的位置,字符串排序)
可以发现有很多复杂度摊在了字符串的比较上。
字符串的比较可以通过字符串哈希转化为数字的比较,优化掉的复杂度。
具体哈希方法多样:
复杂度都为
注意事项:
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define ll unsigned long long#define re register#define il inline#define fp(i,a,b) for(re int i=a;i<=b;i++)#define fq(i,a,b) for(re int i=a;i>=b;i--)using namespace std;int n,l,s;ll Hash[40000],Hash1[40000],B[40000],ans;char a[40000][300];int main(){scanf("%d%d%d",&n,&l,&s);fp(i,1,n) scanf("%s",a[i]+1);B[0]=1;B[1]=359;fp(i,2,l) B[i]=B[i-1]*359;fp(i,1,n)fp(j,1,l)Hash[i]^=(a[i][j]*B[j-1]),Hash1[i]=Hash[i];fp(i,1,l){fp(j,1,n) Hash[j]=Hash1[j],Hash[j]^=(a[j][i]*B[i-1]);sort(Hash+1,Hash+n+1);re int now=1;fp(j,2,n) if(Hash[j]==Hash[j-1]) ans+=now,++now;else now=1;}printf("%lld\n",ans);return 0;}
