#include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1e6 + 5; ll ans = 0; namespace SAM { struct Node { int ch[26], fa, val; int len; Node(int len=0) : len(len), fa(-1), val(0) { memset(ch, 0, sizeof(ch)); } } st[maxn << 1]; int last, pt; void init() { st[last = pt = 0] = Node(0); } void extend(int v, int l) { int p = last, cur = ++pt; st[cur] = Node(l); st[cur].val = 1; for (; ~p && !st[p].ch[v]; p = st[p].fa) st[p].ch[v] = cur; if (p == -1) st[cur].fa = 0; else { int q = st[p].ch[v]; if (st[p].len + 1 == st[q].len) st[cur].fa = q; else { int copy = ++pt; memcpy(&st[copy], &st[q], sizeof(Node)); st[copy].len = st[p].len + 1; st[copy].val = 0; st[q].fa = copy; st[cur].fa = copy; for (; ~p && st[p].ch[v] == q; p = st[p].fa) st[p].ch[v] = copy; } } last = cur; } int d[maxn << 1], q[maxn << 1], s, t; void solve() { q[s = t = 0] = 0; d[0] = 1; for (register int i = 1; i <= pt; i++) d[st[i].fa]++; for (register int i = 0; i <= pt; i++) if (!d[i]) q[t++] = i; for (; s < t; ) { int u = q[s++]; st[st[u].fa].val += st[u].val; if (!--d[st[u].fa]) q[t++] = st[u].fa; if (st[u].val > 1) ans = max(ans, (ll)st[u].val * st[u].len); } } } char s[maxn]; int main() { freopen("ques.in", "r", stdin); freopen("ques.out", "w", stdout); scanf("%s", s); SAM::init(); for (register int i = 0, end = strlen(s); i < end; i++) SAM::extend(s[i] - 'a', i+1); SAM::solve(); printf("%lld", ans); return 0; }