#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <cstring>
using namespace std;
const int maxn = 1e6+10;
struct SAM{
map<char, int> next[maxn];
int last, cur;
int len[maxn], link[maxn], cnt[maxn];
void init(){
next[0].clear();
last = 0;
cur = 0;
len[0] = 0;
link[0] = -1;
memset(vis, 0, sizeof vis);
}
int newnode(){
cur++;
next[cur].clear();
return cur;
}
void insert(char ch){
int p = newnode();
len[p] = len[last] + 1;
cnt[p] = 1;
int q = last;
last = p;
while(q != -1 && !next[q].count(ch)){
next[q][ch] = p;
q = link[q];
}
if(q == -1){
link[p] = 0;
return;
}
int r = next[q][ch];
if(len[r] == len[q] + 1){
link[p] = r;
return;
}
int nq = newnode();
next[nq] = next[r];
link[nq] = link[r];
len[nq] = len[q]+1; link[p] = link[r] = nq;
while(q != -1 && next[q][ch] == r){
next[q][ch] = nq;
q = link[q];
}
}
stack<int> S;
bool vis[maxn];
void toposort(int p){
S.push(p);
vis[p] = 1;
for(char ch = 'a'; ch <= 'z'; ch++){
if(next[p].count(ch) && !vis[next[p][ch]]){
toposort(next[p][ch]);
}
}
}
int solve(){
toposort(0);
int n = S.size();
while(!S.empty()){
int s = S.top(); S.pop();
if(s == 0) break;
cnt[link[s]] += cnt[s];
}
int ans = 0;
for(int i = 1; i <= cur; i++){
if(cnt[i] <= 1) continue;
ans = max(ans, cnt[i] * len[i]);
}
return ans;
}
}sam;
char S[maxn];
int main(){
cin >> S;
int n = strlen(S);
sam.init();
for(int i = 0; i < n; i++){
sam.insert(S[i]);
}
cout << sam.solve();
}