详细讲解
例题
有点难懂,关于复杂度的证明见链接。
#include<bits/stdc++.h>
using namespace std;
const int M=2e6+5;
struct node{
int ch[26];
int len,fa;
node(){memset(ch,0,sizeof(ch));len=0;}
}dian[M];
vector<int> G[M];
int las=1,tot=1;
long long sum[M],ans;
void add(int c){
int p=las;
int np=las=++tot;
sum[tot]=1;
dian[np].len=dian[p].len+1;
for(;p&&!dian[p].ch[c];p=dian[p].fa){
dian[p].ch[c]=np;
}
if(!p) dian[np].fa=1;
else {
int q=dian[p].ch[c];
if(dian[q].len==dian[p].len+1) {
dian[np].fa=q;
}
else {
int nq=++tot;
dian[nq]=dian[q];
dian[nq].len=dian[p].len+1;
dian[q].fa=dian[np].fa=nq;
for(;p&&dian[p].ch[c]==q;p=dian[p].fa){
dian[p].ch[c]=nq;
}
}
}
}
char s[M];int _len;
void dfs(int x){
int siz=G[x].size();
for(int i=0;i<siz;i++){
int y=G[x][i];
dfs(y);
sum[x]+=sum[y];
}
if(sum[x]!=1) ans=max(ans,1LL*dian[x].len*sum[x]);
}
int main(){
scanf("%s",s);
_len=strlen(s);
for(int i=0;i<_len;i++) add(s[i]-'a');
for(int i=2;i<=tot;i++){
G[dian[i].fa].push_back(i);
}
dfs(1);
printf("%lld",ans);
return 0;
}