后缀自动机学习笔记



点击查看代码
#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;
}
posted @ 2024-02-03 19:31  D06  阅读(5)  评论(0编辑  收藏  举报