题目: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;
}
else
up=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;
}