[BZOJ3676][APIO2014]回文串
题意
求串\(S\)中所有回文串长度乘以该回文串出现次数的最大值。
sol
出现次数就是回文树上的子树\(size\)。
嗯做完了。
code
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 3e5+5;
int last,tot,tr[N][26],fa[N],len[N],sz[N];
char s[N];long long ans;
void init()
{
fa[last=0]=fa[1]=1;
len[tot=1]=-1;
}
void extend(int c,int n)
{
int v=last;
while (s[n-len[v]-1]!=s[n]) v=fa[v];
if (!tr[v][c])
{
int u=++tot,k=fa[v];
len[u]=len[v]+2;
while (s[n-len[k]-1]!=s[n]) k=fa[k];
fa[u]=tr[k][c];tr[v][c]=u;
}
last=tr[v][c];sz[tr[v][c]]++;
}
int main()
{
scanf("%s",s+1);
int n=strlen(s+1);
init();
for (int i=1;i<=n;++i) extend(s[i]-'a',i);
for (int i=tot;i>1;--i)
ans=max(ans,1ll*sz[i]*len[i]),sz[fa[i]]+=sz[i];
printf("%lld\n",ans);
return 0;
}