这个题啊,裸的回文自动机
具体说明:点击打开链接
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define maxn 300100
#include<algorithm>
using namespace std;
char str[maxn];
struct pam{
int top,lst;
int trie[maxn][26],fail[maxn],len[maxn],size[maxn];
pam(){top=1;len[1]=-1;fail[0]=fail[1]=1;}
void insert(char c,int n){
int p=lst;
while(str[n-len[p]-1]!=str[n])p=fail[p];
if(!trie[p][c]){
int now=++top,lp=fail[p];
len[now]=len[p]+2;
while(str[n-len[lp]-1]!=str[n])lp=fail[lp];
fail[now]=trie[lp][c];
trie[p][c]=now;//不能放到前面!!!
}
lst=trie[p][c];
size[lst]++;
}
void calc(){
long long ans=0;
for(int i=top;i>=2;--i){
size[fail[i]]+=size[i];
ans=max(ans,(1ll)*size[i]*len[i]);
}
printf("%lld",ans);
}
}ss;
int main(){
scanf("%s",str);
for(int i=0;str[i];i++)ss.insert(str[i]-'a',i);
ss.calc();
}