博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【文文殿下】对后缀自动机(SAM)的理解
阅读量:6205 次
发布时间:2019-06-21

本文共 1613 字,大约阅读时间需要 5 分钟。

后缀自动机,是一种数据结构,是由状态和转移关系构成的。它虽然叫做后缀自动机,可是他却与后缀并没有什么太大的联系。

后缀自动机的每一种状态都是原串的一些子串的集合,每个子串只唯一存在于某个状态中,对每一个字符串,有一个唯一的SAM与其对应。

后缀自动机有一个叫做Right的数组,它所代表的意义是:当前可识别位置的端点的个数,它长得很像后缀数组。此外,每个状态还有一个maxmin值,表示len值可以取的最大值和最小值,但通常,我们不储存min值,因为对于一个状态的min他等于它的parentmax+1

每个状态的max值是这个状态所包含的最大的子串的长度,min值是其最小子串的长度。

后缀自动机会生成一个叫做parent树的东西,他是原串的反串的后缀树,在后缀树上dfs一边,就能获得后缀数组。

 

 

#include
#include
#include
const int maxn = 2000010;char S[maxn];int cnt=1,last=1,Right[maxn],tr[maxn][30],par[maxn],c[maxn],mx[maxn],n,id[maxn];void extend(int x) { int np=++cnt,p=last;Right[np]=1; mx[np]=mx[p]+1;last=np; while(p&&!tr[p][x]) tr[p][x]=np,p=par[p]; if(!p) par[np]=1; else { int q=tr[p][x]; if(mx[q]==mx[p]+1) par[np]=q; else { int nq=++cnt;mx[nq]=mx[p]+1; memcpy(tr[nq],tr[q],sizeof(tr[q])); par[nq]=par[q];par[q]=par[np]=nq; while(p&&tr[p][x]==q) tr[p][x]=nq,p=par[p]; } }}void topsort() { for(register int i=1;i<=cnt;++i) ++c[mx[i]]; for(register int i=1;i<=n;++i) c[i]+=c[i-1]; for(register int i=1;i<=cnt;++i) id[c[mx[i]]--]=i; for(register int i=cnt;i;--i) Right[par[id[i]]]+=Right[id[i]];}int main() { scanf("%s",S+1);long long ans=0; n=strlen(S+1);for(register int i=1;i<=n;++i) extend(S[i]-'a');topsort(); for(register int i=1;i<=cnt;++i) { int cur = id[i]; if(Right[cur]>1) { ans=std::max(ans,1LL*mx[cur]*Right[cur]); } } printf("%lld",ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/Syameimaru/p/9339001.html

你可能感兴趣的文章
Django——认证系统(Day72)
查看>>
idea 如何隐藏/展示不想看到的文件
查看>>
JAVA流程控制学习总结
查看>>
配置yum,nc,telnet
查看>>
IOS 应用中从竖屏模式强制转换为横屏模式
查看>>
jvm02
查看>>
jmeter学习笔记(一)
查看>>
MySQL索引背后的数据结构及算法原理-转
查看>>
去除inline-block元素间间距的N种方法
查看>>
多个 gradle 文件夹 \.gradle\wrapper\dists\ 设置gradle不是每次都下载
查看>>
Oracle11.2.0.4 windows32+64bit opatch工具 11.2.0.0 百度云盘下载
查看>>
Server Develop (三) 多进程实现C/S
查看>>
HBase数据备份及恢复(导入导出)的常用方法
查看>>
一个例子看懂神马是闭包
查看>>
1206封装电容在物料可靠性设计比较低
查看>>
高仿人人Android梦想版终极源码发送(转)
查看>>
调试与分析
查看>>
Nginx 实战(一) 集群环境搭建
查看>>
[BFS]JZOJ 4672 Graph Coloring
查看>>
分页存储过程
查看>>