bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676
回文自动机模板题
4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 300001 char ss[N]; int s[N]; int tot=1,last; int fail[N],len[N],cnt[N]; int tr[N][26]; int p,c,np,t; void extend(int i) { p=last; c=s[i]; while(s[i-1-len[p]]!=c) p=fail[p]; if(!tr[p][c]) { np=++tot; len[np]=len[p]+2; t=fail[p]; while(s[i-1-len[t]]!=c) t=fail[t]; fail[np]=tr[t][c]; tr[p][c]=np; } else np=tr[p][c]; cnt[last=np]++; } int main() { scanf("%ss",ss+1); int n=strlen(ss+1); s[0]=-1; for(int i=1;i<=n;++i) s[i]=ss[i]-'a'; fail[0]=1; len[1]=-1; for(int i=1;i<=n;++i) extend(i); for(int i=tot;i>1;--i) cnt[fail[i]]+=cnt[i]; long long ans=0; for(int i=2;i<=tot;++i) ans=max(ans,1LL*cnt[i]*len[i]); printf("%lld",ans); }