洛谷 P3804 [模板] 后缀自动机

时间:2023-03-09 17:20:26
洛谷 P3804 [模板] 后缀自动机

题目:https://www.luogu.org/problemnew/show/P3804

模仿了一篇题解,感觉很好写啊。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=2e6+;
int n,lst=,cnt=,go[xn][],fa[xn],l[xn],siz[xn],tax[xn],a[xn];
char s[xn];
void add(int w)
{
int p=lst,np=++cnt; lst=np; l[np]=l[p]+;
for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
if(!p)fa[np]=;//
else
{
int q=go[p][w];
if(l[q]==l[p]+)fa[np]=q;
else
{
int nq=++cnt; l[nq]=l[p]+;
fa[nq]=fa[q]; fa[q]=nq; fa[np]=nq;
memcpy(go[nq],go[q],sizeof go[q]);
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
siz[np]=;
}
int main()
{
scanf("%s",s+); n=strlen(s+);
for(int i=;i<=n;i++)add(s[i]-'a');
for(int i=;i<=cnt;i++)tax[l[i]]++;
for(int i=;i<=cnt;i++)tax[i]+=tax[i-];
for(int i=;i<=cnt;i++)a[tax[l[i]]--]=i;
ll ans=;
for(int i=cnt;i;i--)
{
int p=a[i]; siz[fa[p]]+=siz[p];
if(siz[p]>)ans=max(ans,(ll)siz[p]*l[p]);
}
printf("%lld\n",ans);
return ;
}