蟹蟹大佬orz
#include<bits/stdc++.h>
using namespace std;
struct NODE{int fa,son[26],len,siz;}a[3000015];
int tot=1;
void update(char x,int i)
{
int p=tot;a[++tot].siz=1;a[tot].len=i+1;
for(;p&&!a[p].son[x];p=a[p].fa)a[p].son[x]=tot;
if(!p){a[tot].fa=1;return;}
int q=a[p].son[x];
if(a[p].len+1==a[q].len){a[tot].fa=q;return;}
a[++tot].fa=a[q].fa;a[q].fa=tot;a[tot].len=a[p].len+1;for(int i=0;i<26;i++)a[tot].son[i]=a[q].son[i];a[tot-1].fa=tot;
for(int i=p;a[i].son[x]==q;i=a[i].fa)a[i].son[x]=tot;
return;
}
struct EDGE{int to,nxt;}edge[3000015];int head[3000015],tt;void Add(int x,int y){edge[++tt].to=y;edge[tt].nxt=head[x];head[x]=tt;return;}
void makeTr(){for(int i=2;i<=tot;i++)Add(a[i].fa,i);return;}
long long Max;
void sol(int x)
{
for(int i=head[x];i;i=edge[i].nxt)sol(edge[i].to),a[x].siz+=a[edge[i].to].siz;
if(a[x].siz!=1)Max=max(Max,(long long)a[x].len*a[x].siz);
return;
}
int main()
{
string s;getline(cin,s);
for(int i=0;i<s.length();i++)update(s[i]-'a',i);
makeTr();sol(1);printf("%lld\n",Max);
return 0;
}