题目描述
题解
回文自动机裸题。
不知道什么是回文自动机的安利一下
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 300010
#define LL long long
char s[N];
int n,now,cur,fail[N],cnt[N],len[N],tot,last,ch[N][26];
LL ans;
int newnode(int x)
{
len[tot]=x;
return tot++;
}
int get_fail(int x,int n)
{
while(s[n-len[x]-1]!=s[n]) x=fail[x];
return x;
}
LL Max(LL a,LL b)
{
return (a>b)?a:b;
}
int main(){
gets(s+1);
s[0]=-1;newnode(0);newnode(-1);fail[0]=1;
for(n=1;s[n];++n)
{
s[n]-='a';
cur=get_fail(last,n);
if (!ch[cur][s[n]])
{
now=newnode(len[cur]+2);
fail[now]=ch[get_fail(fail[cur],n)][s[n]];
ch[cur][s[n]]=now;
}
cnt[last=ch[cur][s[n]]]++;
}
for(n=--tot;n>1;--n)
cnt[fail[n]]+=cnt[n],ans=Max(ans,(LL)cnt[n]*(LL)len[n]);
printf("%lld\n",ans);
}