rt,AC on 1
#include <map>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define D double
#define LD long double
#define LL long long
#define ULL unsigned long long
#define S string
#define fi first
#define se second
#define mp make_pair
using namespace std;
int slink[2000010];
int maxlen[2000010];
int nxt[2000010][30];
int TOT = -1;
LL siz[2000010];
int nw(int _maxlen, int _minlen, int *_nxt, int _slink)
{
TOT++;
maxlen[TOT] = _maxlen;
for (int i = 0; i < 26; i++)
{
if (_nxt == nullptr)
{
nxt[TOT][i] = -1;
}
else
{
nxt[TOT][i] = _nxt[i];
}
}
slink[TOT] = _slink;
// if (TOT != 1)
siz[TOT] = 1;
return TOT;
}
int insert(char c, int u)
{
int k = c - 'a';
int v = u;
int z = nw(maxlen[u] + 1, -1, nullptr, -1);
while (v != -1 && nxt[v][k] == -1)
{
nxt[v][k] = z;
v = slink[v];
}
if (v == -1)
{
slink[z] = 0;
return z;
}
int x = nxt[v][k];
if (maxlen[x] == maxlen[v] + 1)
{
slink[z] = x;
return z;
}
int y = nw(maxlen[v] + 1, -1, nxt[x], slink[x]);
slink[y] = slink[x];
slink[x] = slink[z] = y;
int w = v;
while (w != -1 && nxt[w][k] == x)
{
nxt[w][k] = y;
w = slink[w];
}
return z;
}
int c[2000010], a[2000010];
int main()
{
S s;
cin >> s;
int n = s.size();
s = ' ' + s;
int lst = nw(0, 0, nullptr, -1);
// slink[0] = -1;
// memset(nxt, -1, sizeof nxt);
for (int i = 1; i <= n; i++)
{
lst = insert(s[i], lst);
}
LL ans = 0;
for (int i = 1; i <= TOT; i++)
c[maxlen[i]]++;
for (int i = 1; i <= TOT; i++)
c[i] += c[i - 1];
for (int i = 1; i <= TOT; i++)
a[c[maxlen[i]]--] = i;
for (int i = TOT; i >= 1; i--)
{
int p = a[i];
siz[slink[p]] += siz[p];
// cout << siz[p];
if (maxlen[p] > 1)
{
ans = max(ans, siz[p] * maxlen[p]);
}
}
cout << ans;
return 0;
}