//bzoj3676 AC代码
//邻接表储存的回文树
#include<bits/stdc++.h>
using namespace std;
const int maxn = 300010*2;// n(空间复杂度o(n*ALP)),实际开n即可  
const int ALP = 26;  
struct PAM{  
    vector<pair<int,int> > next[maxn];  
    int fail[maxn],num[maxn],len[maxn];  
    int cnt[maxn];  
    int s[maxn],n,p,last,sum;  
  
    int newnode(int w){  
        next[p].clear();  
        cnt[p]=num[p]=0;  
        len[p]=w;  
        return p++;  
    }  
    void init(){  
        p = 0;  
        sum = 0;  
        newnode(0);  
        newnode(-1);  
        last = 0;  
        n = 0;  
        s[n] = -1;  
        fail[0] = 1;  
    }  
    int get_fail(int x){  
        while(s[n-len[x]-1] != s[n]) x = fail[x];  
        return x;  
    }  
    int add(int c){  
        c -= 'a';  
        s[++n] = c;  
        int cur = get_fail(last);  
        int flag = 0;  
        for(int i=0;i<next[cur].size();i++)  
        if(next[cur][i].first==c){  
            last = next[cur][i].second;  
            cnt[last]++;  
            return num[last];  
        }  
        int now = newnode(len[cur]+2);  
        int fi = get_fail(fail[cur]);  
        flag = 0;  
        for(int i=0;i<next[fi].size();i++)  
        if(next[fi][i].first==c){  
            flag = next[fi][i].second;  
            break;  
        }  
        fail[now] = flag;  
        next[cur].push_back(make_pair(c,now));  
        num[now] = num[flag] + 1;  
        last = now;  
        cnt[now]++;  
        return num[now];  
    }  
    void count(){  
        for(int i=p-1;i>1;i--){  
            cnt[fail[i]] += cnt[i];  
        }  
    }  
} pam;
char c[300010];
int len;
int main()
{
	pam.init();
	scanf("%s",c+1);
	len=strlen(c+1);
	for(int i=1;i<=len;i++)
	{
		pam.add(c[i]);
	}
	pam.count();
	long long ans=0;
	for(int i=2;i<pam.p;i++)
	{
		ans=max(ans,(long long)(pam.len[i])*pam.cnt[i]);
	}
	printf("%lld\n",ans);
	return 0;
}