#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+10;
ll n,ans=0;
char s[N],a[N];
int top=0,belong[N],p[N];
int dp[N];
int f[N][25];
struct node{
int maxlen[N],link[N];
int ch[N][30];
int id[N];
int last,Size;
vector<int> g[N];
void init(){
memset(maxlen,0,sizeof(maxlen));
memset(link,0,sizeof(link));
memset(ch,0,sizeof(ch));
last=0;
Size=0;
for(int i=0;i<=600000;i++) g[i].clear();
link[0]=-1;
}
void extend(){
for(int i=1;i<=n;i++){
int cur=++Size,c=s[i]-'a',p=last;
maxlen[cur]=maxlen[last]+1;
dp[cur]=1;
id[i]=cur;
while(p!=-1&&!ch[p][c]){
ch[p][c]=cur;
p=link[p];
}
if(p==-1) link[cur]=0;
else{
int q=ch[p][c];
if(maxlen[p]+1==maxlen[q]) link[cur]=q;
else{
int copy=++Size;
maxlen[copy]=maxlen[p]+1;
link[copy]=link[q];
for(int i=0;i<26;i++) ch[copy][i]=ch[q][i];
while(p!=-1&&ch[p][c]==q){
ch[p][c]=copy;
p=link[p];
}
link[q]=link[cur]=copy;
}
}
last=cur;
}
for(int i=1;i<=Size;i++) g[link[i]].push_back(i);
}
void dfs(int u,int fa){
f[u][0]=fa;
for(int v:g[u]){
dfs(v,u);
dp[u]+=dp[v];
}
}
void check(int l,int r){
if(l<1||r>n) return;
int now=id[r];
for(int i=20;i>=0;i--){
if(maxlen[f[now][i]]>=r-l+1) now=f[now][i];
}
ans=max(ans,(ll)dp[now]*(r-l+1));
}
}SAM;
void manacher(){
a[++top]='~';
for(int i=1;i<=n;i++){
a[++top]='|';
a[++top]=s[i];
belong[top]=i;
}
a[++top]='|';
a[++top]='`';
int mid=0,r=0;
for(int i=1;i<=top;i++){
if(i<=r) p[i]=min(p[mid*2-i],r-i+1);
else p[i]=1;
SAM.check(belong[i-(p[i]-1)+1],belong[i+(p[i]-1)-1]);
while(a[i-p[i]]==a[i+p[i]]){
p[i]++;
SAM.check(belong[i-(p[i]-1)+1],belong[i+(p[i]-1)-1]);
}
if(i+p[i]-1>=r){
r=i+p[i]-1;
mid=i;
}
}
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
SAM.init();
SAM.extend();
SAM.dfs(0,0);
for(int j=1;j<=20;j++){
for(int i=0;i<=SAM.Size;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
manacher();
cout<<ans;
return 0;
}