This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define pb                     push_back
#define ll                     long long
#define forn(i,n)              for(int i=0; i<(int)n; i++)
#define forn1(i,n)              for(int i=1; i<=(int)n; i++)
#define sfd(a)                 scanf("%d", &a)
#define sffd(a,b)              scanf("%d%d", &a, &b)
#define sffl(a,b)              scanf("%lld%lld", &a,&b)
#define sfl(a)                 scanf("%lld", &a)
#define pii                    pair<int , int>
#define pll                    pair<ll , ll>
#define ff                     first
#define ss                     second
#define mem(a, val)            memset(a, val, sizeof(a))
#define all(x)                 (x).begin(), (x).end()
//#define mx                     200005
#define INF_mx                 1e18
#define gcd(a,b)               __gcd(a, b)
#define lcm(a,b)               (a*b)/__gcd(a,b)
#define PRINT                  cout<<"hi"<<endl
#define PI acos(-1)
#define fast_in_out          ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define Q    int q; cin>>q; while(q--)
/*
const ll sz=1000001;
const ll N=1e12;
vector<ll>prime;
bool flag[sz+3];
void sieve(void)
{
    ll i,j,add;
    flag[0]=flag[1]=1;
    prime.push_back(2);
    for(i=4; i<sz; i+=2)
        flag[i]=1;
    for(i=3; i<sz; i+=2)
    {
        if(!flag[i])
        {
            prime.push_back(i);
            if(sz/i>=i)
            {
                add=i*2;
                for(j=i*i; j<sz; j+=add)
                    flag[j]=1;
            }
        }
    }
}
*/
/*
const int MOD = 1000000007 ;
long long int  bigmod ( long long B, int P, int M )
{
    if ( P == 0 )return 1;
    if ( P % 2 ) {
        return ( ( B % M ) * ( bigmod ( B, P-1, M))) % M;
    }
    else {
        long long mod = bigmod (B,P/2,M);
        return ((mod%M)*(mod%M))%M;
    }
}
*/
/*
 tree<
       int,
     null_type,
     less_equal<int>,
     rb_tree_tag,
     tree_order_statistics_node_update>t;
*/
const ll N  = 2e5 + 10 ;
ll Tree[N][26], idx;
ll len[N], link[N], t;
string s;
ll occ[N];
void pre_set(){
      len[1] = -1, link[1] = 1;
      len[2] = 0, link[2] = 1;
      idx = t = 2 ;
      mem(occ, 0);
}
void extend(int p)
{
   while(s[p - len[t] - 1 ] !=  s[p]) t = link[t];
   int x = link[t];
   while(s[p - len[x] -1] != s[p] ) x = link[x];
   int c = s[p] - 'a';
   if(!Tree[t][c]){
     Tree[t][c] =  ++idx;
     len[idx] = len[t]+2;
     link[idx] = len[idx] == 1 ? 2 : Tree[x][c];
   }
   t = Tree[t][c];
   occ[t]++;
}
int main()
{
 fast_in_out
     cin>>s;
     pre_set();
     for(int i=0; i<s.size(); i++){
        extend(i);
     }
     for(int i=idx; i>2 ;i--){
        occ[link[i]]+=occ[i];
     }
     ll mx=0;
     for(int i=idx; i>2; i--){
        if(occ[i]*len[i] > mx ) mx = occ[i] * len[i];
     }
     cout << mx << endl;
    return 0;
}
Compilation message (stderr)
palindrome.cpp: In function 'int main()':
palindrome.cpp:134:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  134 |      for(int i=0; i<s.size(); i++){
      |                   ~^~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |