后缀自动机真是个好东西

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define sc(x) scanf("%d",&x)
using namespace std;
const int maxn=2010000;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n; n = n * n;} return r;}
char s[maxn];
int fa[maxn],ch[maxn][26],len[maxn],siz[maxn];
int lst=1,node=1,l,t[maxn],A[maxn];
ll ans;
void extend(int c)
{
    int f=lst,p=++node;lst=p;
    len[p]=len[f]+1;siz[p]=1;
    while(f&&!ch[f][c]) ch[f][c]=p,f=fa[f];
    if(!f){fa[p]=1;return;}
    int x= ch[f][c],y=++node;
    if(len[f]+1==len[x]){fa[p]=x;node--;return;}
    len[y]=len[f]+1;fa[y]=fa[x];fa[x]=fa[p]=y;
    memcpy(ch[y],ch[x],sizeof(ch[y]));
    while(f&&ch[f][c]==x) ch[f][c]=y,f=fa[f];
}
int main()
{
    scanf("%s",&s[1]);
    l= strlen(&s[1]);
    for(int i=1;i<=l;i++) extend(s[i]-'a');
    for(int i=1;i<=node;i++) t[len[i]]++;
    for(int i=1;i<=node;i++) t[i]+=t[i-1];
    for(int i=1;i<=node;i++) A[t[len[i]]--]=i;
    for(int i=node;i>=1;i--)
    {
        int now = A[i];siz[fa[now]]+=siz[now];
        if(siz[now]>1) ans=max(ans,1ll*siz[now]*len[now]);

    }
    printf("%lld\n",ans);
    return 0;
}