题意
对于一个字符串
S
,定义
题解
fail
树的简单运用。
一个点所代表的前缀的出现次数=在
fail
树上以这个点为根的子树大小。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005;
typedef long long LL;
int n,nxt[maxn],sz[maxn];
LL ans;
char s[maxn];
int main(){
freopen("51nod1277.in","r",stdin);
freopen("51nod1277.out","w",stdout);
scanf("%s",s+1); n=strlen(s+1);
for(int i=2,j=0;i<=n;i++){
while(j&&s[j+1]!=s[i]) j=nxt[j];
if(s[j+1]==s[i]) j++;
nxt[i]=j;
}
for(int i=n;i>=1;i--){
sz[i]++; ans=max(ans,(LL)sz[i]*i);
sz[nxt[i]]+=sz[i];
}
printf("%lld\n",ans);
return 0;
}