后缀自动机学习笔记
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct t1
{
int l,ta;
long long len,cnt;
map<char,int>q;
}t[2000005];
vector<int>a[2000005];
int tot,la;
long long ans;
void calc(int x)
{
if(t[x].cnt>1)
{
ans=max(ans,t[x].len*t[x].cnt);
}
}
void spread(int p)
{
t[t[p].l].cnt+=t[p].ta;
t[t[p].l].ta+=t[p].ta;
t[p].ta=0;
}
void add(char c)
{
tot++;
t[tot].len=t[la].len+1;
t[tot].cnt=1;
t[tot].ta=0;
int cur=la;
la=tot;
bool f=false;
while(t[cur].q.find(c)==t[cur].q.end())
{
t[cur].q[c]=tot;
if(cur==0)
{
f=true;
break;
}
spread(cur);
calc(t[cur].l);
cur=t[cur].l;
}
if(f==true)
{
t[tot].l=0;
return;
}
int p=cur,q=t[p].q[c];
cur=tot;
if(t[q].len==t[p].len+1)
{
t[cur].l=q;
t[q].cnt++;
t[q].ta++;
calc(q);
return;
}
spread(q);
tot++;
int cl=tot;
t[cl]=t[q];
t[cl].len=t[p].len+1;
t[q].l=cl;
t[cur].l=cl;
while(1)
{
if(t[p].q[c]==q)
{
t[p].q[c]=cl;
}
if(p==0)
{
break;
}
p=t[p].l;
}
t[cl].cnt++;
t[cl].ta++;
calc(cl);
}
int dfs(int n1)
{
int sum=0;
for(int i=0;i<a[n1].size();i++)
{
sum=sum+dfs(a[n1][i]);
}
t[n1].cnt+=sum;
calc(n1);
return sum+t[n1].ta;
}
int main()
{
string s;
cin>>s;
t[0].len=t[0].cnt=0;
t[0].l=-1;
la=0;
for(int i=0;i<s.size();i++)
{
add(s[i]);
}
for(int i=1;i<=tot;i++)
{
a[t[i].l].push_back(i);
}
dfs(0);
cout<<ans<<endl;
return 0;
}