题意:
给一个字符串s。定义s的一个子串t的“出
现值”为t在s中的出现次数乘以t的长度。求出s的所有回文子串中的最
大出现值。
题解:
manacher求出所有本质不同的回文子串后在后缀自动机上二分。
(网上说的什么回文自动机感觉不清真啊。。)
#include<bits/stdc++.h>
using namespace std;
const int Maxn=6e5+50;
char ch[Maxn],S[Maxn];
int pos[Maxn],n,tot;
long long ans;
struct SAM
{
int last,len[Maxn],cnt,link[Maxn][21],f[Maxn],son[Maxn][26],c[Maxn],que[Maxn];
SAM()
{
last=++cnt;
};
inline void extend(int c,int o)
{
int p=last,np=last=++cnt;len[np]=len[p]+1;
f[np]=1;pos[o]=np;
while(!son[p][c]&&p)son[p][c]=np,p=link[p][0];
if(!p)link[np][0]=1;
else
{
int q=son[p][c];
if(len[q]==len[p]+