[BZOJ3676][APIO2014]回文串

bzoj
luogu

题意

求串(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
",ans);
	return 0;
}

原文地址:https://www.cnblogs.com/zhoushuyu/p/8696363.html