#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline ll read(){
ll x=0,w=1;
char aa=getchar();
while(aa<'0'||aa>'9'){
if(aa=='-'){
w=-1;
}
aa=getchar();
}
while(aa>='0'&&aa<='9'){
x=(x<<3)+(x<<1)+aa-'0';
aa=getchar();
}
return x*w;
}
const int N=1e6+10;
struct tree{
ll len;
int fa,ch[31];
tree(){memset(ch,0,sizeof(ch));len=fa=0;}
}tr[N<<1];
int n,tot=1,la=1;
ll ans,sz[N];
char s[N];
vector<int> e[N<<1];
void insert(int x){
int p=la,np=la=++tot;sz[tot]=1;
tr[np].len=tr[p].len+1;
for(;p&&!tr[p].ch[x];p=tr[p].fa) tr[p].ch[x]=np;
if(!p) tr[np].fa=1;
else{
int q=tr[p].ch[x];
if(tr[p].len+1==tr[q].len) tr[np].fa=q;
else{
int nq=++tot;
tr[nq]=tr[q];
tr[nq].len=tr[p].len+1;
tr[q].fa=tr[np].fa=nq;
for(;p&&tr[p].ch[x]==q;p=tr[p].fa) tr[p].ch[x]=nq;
}
}
}
void dfs(int x){
for(int i=0;i<e[x].size();i++){
int y=e[x][i];
dfs(y);
sz[x]+=sz[y];
}
if(sz[x]!=1) ans=max(ans,sz[x]*tr[x].len);
}
int main()
{
cin>>(s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++) insert(s[i]-'a');
for(int i=2;i<=tot;i++) e[tr[i].fa].push_back(i);
dfs(1);
printf("%lld\n",ans);
return 0;
}
提交记录:https://www.luogu.com.cn/record/84798287