#include<bits/stdc++.h>
using namespace std;
struct nod{
int fa=0,ch[30],len=0;
nod(){memset(ch,0,sizeof(ch));len=fa=0;}
}dian[2000004];
int tot=1;
int las=0;
long long zhi[2000004];
void add(int x){
tot++;
dian[tot].len=dian[tot-1].len+1;
zhi[tot]=1;
int p=tot-1;
for(;p&&!dian[p].ch[x];p=dian[p].fa) dian[p].ch[x]=tot;
if(p==0)dian[tot].fa=1;
else {
int q=dian[p].ch[x];
if(dian[q].len==dian[p].len+1) dian[tot].fa=q;
else{
int clone=++tot;
dian[clone]=dian[q];
dian[clone].len=dian[p].len+1;
dian[q].fa=dian[clone].fa=clone;
for(;p&&dian[p].ch[x]==q;p=dian[p].fa) dian[p].ch[x]=clone;
}
}
}
struct node{
int gg,to;
}a[2000004];
int cnt=0;
int last[2000005];
void adde(int x,int y){
a[++cnt].to=y;
a[cnt].gg=last[x];
last[x]=cnt;
}
long long maxn=0;
void dfs(int x){
for(int i=last[x];i;i=a[i].gg){
int y=a[i].to;
dfs(y);
zhi[x]+=zhi[y];
}
if(zhi[x]!=1) maxn=max(maxn,zhi[x]*dian[x].len);
}
char s[2000004];
int main(){
scanf("%s",s);
int op=strlen(s);
for(int i=0;i<op;i++) add(s[i]-'a');
for(int i=2;i<=tot;i++) adde(dian[i].fa,i);
dfs(1);
cout<<maxn;
}