#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define R register
#define LL long long
const int inf = 0x3f3f3f3f;
const int N = 2e6 + 10;
inline int read() {
char a = getchar(); int x = 0,f = 1;
for(;a > '9' || a < '0';a = getchar()) if(a == '-') f = -1;
for(;a >= '0' && a <= '9'; a = getchar()) x = x * 10 + a - '0';
return x * f;
}
char s[N];
int fa[N], ch[N][26], len[N], siz[N];
int lst = 1, node = 1, n;
LL ans;
inline void insert(int c) {
int now = lst, p = ++ node; lst = p;
len[p] = len[now] + 1; siz[p] = 1;
while(now && !ch[now][c]) ch[now][c] = p, now = fa[now];
if(! now) { fa[p] = 1; return ; }
int x = ch[now][c];
if(len[now] + 1 == len[x]) { fa[p] = x; return ; }
int y = ++ node; len[y] = len[now] + 1; fa[y] = fa[x]; fa[x] = fa[p] = y;
memcpy(ch[y], ch[x], sizeof(ch[y]));
while(now && ch[now][c] == x) ch[now][c] = y, now = fa[now];
}
struct edge {
int to, next;
}e[N << 1];
int head[N], cnt;
inline void add(int x, int y) { e[++ cnt] = {y, head[x]}; head[x] = cnt; }
inline void dfs(int x) {
for(R int i = head[x]; i; i = e[i].next) {
int y = e[i].to;
dfs(y); siz[x] += siz[y];
}
if(siz[x] > 1) ans = max(ans, 1LL * siz[x] * len[x]);
}
int main() {
scanf("%s", s + 1); n = strlen(s + 1);
for(R int i = 1; i <= n; i ++) insert(s[i] - 'a');
for(R int i = 1; i <= node; i ++) add(fa[i], i);
dfs(1); printf("%lld\n", ans);
return 0;
}