首页 > 其他分享 >后缀自动机学习笔记

后缀自动机学习笔记

时间:2024-02-03 19:45:08浏览次数:22  
标签:cnt cur cl 后缀 笔记 len int tot 自动机



点击查看代码
#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;
}

标签:cnt,cur,cl,后缀,笔记,len,int,tot,自动机
From: https://www.cnblogs.com/watersail/p/18005098

相关文章

  • 【阅读笔记】《A New Hardware-Efficient Algorithm and Reconfigurable Architecture
    一、对比度增强算法AGCWD硬件化实现2013年发表在TIP上的对比度增强算法AGCWD(Efficientcontrastenhancementusingadaptivegammacorrectionwithweightingdistribution)2014年发表在IEEETransactionsonImageProcessing的《ANewHardware-EfficientAlgorithmandReco......
  • RabbitMQ 学习笔记 - 1
    RabbitMQ的基础概念生产者产生数据发送消息的程序是生产者交换机交换机是RabbitMQ非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切的知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢......
  • 【阅读笔记】对比度增强-《Efficientcontrast enhancement using adaptive gamma corr
    2013年发表在TIP上的对比度增强算法AGCWD(Efficientcontrastenhancementusingadaptivegammacorrectionwithweightingdistribution)提出了一种自动映射技术,通过亮度像素的伽马校正和概率分布来提高调暗图像的亮度。为了增强视频,所提出的图像增强方法使用关于每帧之间差异的......
  • 【阅读笔记】对比度增强-《Efficientcontrast enhancement using adaptive gamma corr
    2013年发表在TIP上的对比度增强算法AGCWD(Efficientcontrastenhancementusingadaptivegammacorrectionwithweightingdistribution)提出了一种自动映射技术,通过亮度像素的伽马校正和概率分布来提高调暗图像的亮度。为了增强视频,所提出的图像增强方法使用关于每帧之间差异的......
  • Pandas库学习笔记(4)---Pandas DataFrame
    PandasDataFrame  PandasDataFrame基本操作DataFrame是二维数据结构,即,数据以表格形式在行和列中对齐。DataFrame的功能潜在的列是不同类型的大小可变标记的轴(行和列)可以对行和列执行算术运算结构体pandas.SeriesSeries结构如下: 让我们假设我们正在使用学生的数......
  • [算法学习笔记] 欧拉路
    免责声明:本文定义并不严谨,笔者是从“浅显易懂”的角度出发写本文。若您需要严谨定义请移步至其他学术文章。基本定义欧拉路径,即能不重不漏经过图上所有边的路径。也可以说“一笔画问题”。特殊地,如果这条路径的起点和终点一致,则这条路径叫做“欧拉回路”。其他的定义:欧拉图......
  • Pandas库学习笔记(3)---Pandas Series
    PandasSeriesPandasSeries基本操作pandas.SeriesSeries结构如下:pandas.Series(data,index,dtype,copy)构造函数的参数如下-data:数据采用各种形式,例如ndarray,list,常量index:索引值必须是唯一且可哈希的,且长度与数据相同。如果未传递索引,则默认为np.arrange(n)。dt......
  • Pandas库学习笔记(2)
    Pandas数据结构Pandas有三种常用的数据结构SeriesDataFramePanel这些数据结构建立在Numpy数组之上,这意味着它们运行速度都非常快。Python、Numpy和Pandas对比Pythonlist:Python自带数据类型,主要用一维,功能简单,效率低Dict:Python自带数据类型,多维键值对,效率低Numpy......
  • 云原生学习第2天笔记
    云原生定义云原生(CloudNative)是指基于云环境、可扩展、可靠的应用程序,它利用容器、微服务、自动化部署、弹性伸缩等特性,使应用程序能够快速、可靠地运行在云环境中。云原生优势云原生应用程序具有以下优势:快速部署:通过容器化技术,实现应用程序的快速打包和部署,减少部署时间。可扩展......
  • 2024年2月笔记:Redis7.2.4版本在Mac电脑的Docker里安装Redis集群
    本文环境:Mac电脑,Brew和Docker都已安装好,Redis版本:7.2.4第1步,验证Docker和Brewdocker--version  //查看docker版本,此处忽略安装Docker步骤brew--version   //查看版本号第2步,创建Redis集群网络dockernetworkcreateredis-cluster-net   //创建一个名......