hdu 4552 怪盗基德的挑战书 (基于hash的LCP)

来源:互联网 发布:cpu淘宝e5水多深 编辑:程序博客网 时间:2024/06/05 09:06

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4552

题意:

分析:若某一后缀S与文本串T的LCP等于x,那么此后缀对答案的贡献为x,枚举后缀即可。

代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;typedef unsigned long long ULL;const int maxn = 1e5+6;const int seed = 131;ULL H[maxn],X[maxn];int Len;char str[maxn];void Init(){H[Len]=0;for(int i=Len-1;i>=0;i--)H[i]=H[i+1]*seed+str[i]-'a';X[0]=1;for(int i=1;i<Len;i++)X[i]=X[i-1]*seed;}ULL GetHash(int i,int L){return H[i]-H[i+L]*X[L];}int LCP(int a,int b,int lim){int ret=0,down=1,mid,up=lim;while(down<=up){mid=(down+up)>>1;if(GetHash(a,mid)==GetHash(b,mid)){down=mid+1;if(ret<mid)ret=mid;}elseup=mid-1;}return ret;}int main(){long long ans;while(scanf("%s",str)==1){Len=strlen(str);Init();ans=0;for(int i=Len-1;i>=0;i--)ans+=LCP(0,i,Len-i);printf("%I64d\n",ans%256);}return 0;}

0 0