#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
#define N 2000005
char s[N];
vector<int>l[N];
int size[N];
struct SAM{
#define sigma 26
int last,tot;
int ch[N<<1][sigma],fa[N<<1],len[N<<1];
void ins(int c){
c-='a';
int pos=last,npos=last=++tot;
len[npos]=len[pos]+1;
for(;pos&&!ch[pos][c];pos=fa[pos])
ch[pos][c]=npos;
if(!pos)fa[npos]=1;
else{
int node=ch[pos][c];
if(len[pos]+1==len[node])
fa[npos]=node;
else{
int nnode=++tot;
len[nnode]=len[pos]+1;
memcpy(ch[nnode],ch[node],sizeof(ch[node]));
fa[nnode]=fa[node];
fa[node]=fa[npos]=nnode;
for(;pos&&ch[pos][c]==node;pos=fa[pos])
ch[pos][c]=nnode;
}
}
}
int insert(char *s){
scanf("%s",s+1);
int len=strlen(s+1);
last=tot=1;
for(int i=1;i<=len;i++)ins(s[i]);
return tot;
}
}tree;
void dfs(int v){
if(v!=1);
for(int i=0;i<l[v].size();i++){
dfs(l[v][i]);
size[v]+=size[l[v][i]];
}
if(size[v]!=1)
Max=max(Max,size[v]*tree.len[v]);
//cout<<tree.len[v]<<" ";
}
int main(){
int len=tree.insert(s);
for(int i=2;i<=len;i++){
l[tree.fa[i]].push_back(i);
}
dfs(1);
}