#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=3e5+50;
struct PalindromicTree{
string s;int len[N];
int link[N],go[N][26],cnt[N],nc,Im,Nula,sada;
vector<int>E[N];
PalindromicTree(){
Im=++nc;link[Im]=Im;len[Im]=-1;
Nula=++nc;link[Nula]=Im;
sada=Im;
}
void Insert(char x){
s.pb(x);int n=s.size();
while(s[n-1]!=s[n-2-len[sada]]) sada=link[sada];
if(!go[sada][x-'a']){
nc++;
go[sada][x-'a']=nc;
len[nc]=len[sada]+2;
int u=link[sada];
while(s[n-1]!=s[n-2-len[u]]) u=link[u];
if(len[nc]==1) u=Nula;
else u=go[u][x-'a'];
link[nc]=u;
}
sada=go[sada][x-'a'];cnt[sada]++;
}
void DFS(int u){
for(auto i:E[u]) DFS(i),cnt[u]+=cnt[i];
}
ll Solve(){
ll res=0;
for(int i=2;i<=nc;i++) E[link[i]].pb(i);
DFS(Im);
for(int i=2;i<=nc;i++) res=max(res,(ll)len[i]*cnt[i]);
return res;
}
}st;
int main(){
string s;cin>>s;
for(auto i:s) st.Insert(i);
ll res=st.Solve();
printf("%lld\n",res);
return 0;
}
| # | 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... |