后缀自动机

从后缀自动机到广义后缀自动机——最详细攻略 广义后缀自动机 前置知识 广义后缀自动机基于下面的知识点 字典树(Trie树) 后缀自动机 请务必对上述两个知识点非常熟悉之后,再来阅读本文,特别是对于后缀自动机中的后缀链接能够有一定的理解 起源 广义后缀自动机是由刘研绎在其2015 国家队论文《后缀自动机在字典树上的拓展》上提出的一种结构,即将后缀自动机直接建立在字典树上。 大部分可以用后缀自动机处理的字符串的问题均可扩展到 Trie 树上。——刘研绎 约定 参考字符串约定 约定字符串的下标为 [1,∣s∣][1, |s|][1,∣s∣]。 约定 阅读详情

clj大佬论文
自己对于后缀自动机的理解:每一个节点代表的是具有相同的right集合的子串(right集合的定义具体去看clj大佬的论文),整个最后构成的有向无环图,可以看成是一棵树,step[i]代表的是right[i]中子串的最长长度也就是论文中所说的Max(i),pre[i]代表的是i节点在树中的父节点,这里和AC自动机里的fail指针有点类似,往上找就相当于找到的是当前串的后缀在SAM中出现过的最长长度。
spoj 1811
题意:给两个串,求最长公共子串

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
char s[maxn],s1[maxn];
int son[maxn][26],pre[maxn],step[maxn],last,total,root;//son儿子边是否存在 pre可以理解为parent树上的父节点  step到达i节点走的最长步数
inline void push_back(int v)
{
    step[++total]=v;
}
void Extend(char ch)
{
    push_back(step[last]+1);//新建ch的节点
    int p=last,np=total;
    for (;!son[p][ch]; p=pre[p]) son[p][ch]=np;//找到有ch出边的节点
    if (!p) pre[np]=root;//如果都没有则指向root
    else//按照论文里面的方法处理
    {
        int q=son[p][ch];
        if (step[q]!=step[p]+1)
        {
            push_back(step[p]+1);
            int nq=total;
            memcpy(son[nq],son[q],sizeof(son[q]));
            pre[nq]=pre[q];
            pre[q]=pre[np]=nq;
            for (; p!=-1&&son[p][ch]==q; p=pre[p]) son[p][ch]=nq;
        }
        else pre[np]=q;
    }
    last=np;
}
void Build()
{
    root=total=last=1;
    memset(son,0,sizeof(son));
    memset(pre,0,sizeof(pre));
    memset(step,0,sizeof(step));
    int len=strlen(s);
    for (int i=0; i<len; i++) Extend(s[i]-'a');
}
void debug()
{
    for(int i = 1; i <= total; ++i)
    {
        printf("id=%d, fa=%d, step=%d, ch=[ ", i, pre[i], step[i]);
        for(int j = 0; j < 26; ++j)
        {
            if(son[i][j])
                printf("%c,%d ", j+'a',son[i][j]);
        }
        puts("]");
    }
}
int main()
{
    while(~scanf("%s%s",s,s1))
    {
        Build();
        //debug();
        int ans=0;
        int p=root,len=strlen(s1),tmp=0;
        for(int i=0; i<len; i++)//用s1在后缀自动机上跑
        {
            if(son[p][s1[i]-'a'])//p节点有s1[i]的出边
                p=son[p][s1[i]-'a'],tmp++;
            else//没有就找出现过的最长后缀
            {
                while(p&&son[p][s1[i]-'a']==0)//找到最长的在s中出现过得后缀
                    p=pre[p];
                if(p)//有则从这个节点继续往下匹配
                {
                    tmp=step[p]+1;
                    p=son[p][s1[i]-'a'];
                }
                else//没有就从根重新开始
                    p=root,tmp=0;
            }
            ans=max(ans,tmp);//更新答案
        }
        printf("%d\n",ans);
    }
}

对于后缀自动机的理解
1.在parent树上某一节点的pre指向的节点代表的是可以和当前节点接收同样的后缀的状态节点。
2.parent树父节点的状态代表的子串是子节点的最长后缀。
3.sam中的转移可以直接对应所有后缀的开头。
4.出现次数向父亲传递,接收串数从儿子获取。

后缀自动机SAM 后缀自动机SAM总结。 阅读详情

相关推荐

从最长公共子串到后缀自动机(LCS->SAM)

Longest Common Substring—Suffix Automaton本文将从最长公共子串开始说起,循序渐进的讲解后缀自动机,希望通过自己的理解帮助到大家,文章目录如下: 最长公共子串问题 后缀自动机历史 后缀自动机简介 后缀自动机相关理论基础 如何构造后缀自动机 后缀自动机的应用 总结 最长公共子串问题首先来看一到经典的例题题目:给出N个长度不超过100000的字符串,求他们的最长公共

菜的抠脚弟弟的专栏 4338

后缀自动机学习小记

简介后缀三姐妹:后缀数组,后缀自动机,后缀树。 后缀自动机:Suffix Automation,也叫SAM。 创立算法的思路来源:能不能构出一个自动机(本质就是一个有向图),能识别一个串的所有后缀。识别所有后缀基础想法把所有的后缀都放进一个trie里面,比如串aabbabd。 这样的状态太多了,怎么把状态数缩小。减小状态数的方法定义一个子串的right集合为这个子串在原串中出现的右端点集合

Facico的博客 5865

生态位宽度计算&可视化展示(R语言)

物种的生态位越宽,该物种的特化程度就越小,倾向于泛化种(generalist species);物种的生态位越窄,倾向于是一个特化种(specialists species)。生态位宽度是指物种(或其它生物单位)在群落中所利用的各种不同资源的总和。本篇所使用为生态位宽度指数即**Levins的生态位宽度指数。

weixin_53705272的博客 4434

后缀自动机刷题小结

鉴于被最近CLJ大神出的多校赛虐的体无完肤后,决心怒学神奇的后缀自动机。 第一遍看CLJ大神的ppt后完全就是晕头转向。 然后我看了一个OIer的blog,算是大概明白了后缀自动机的构造过程,理解了之后发现代码还是比较容易写的,基本不需要模板。 之后就是刷题了……可是以刷题就发现各种不会做……仲么破!!! 各种借鉴之后,才把几道算是模板的题都刷完了,还需要再深入理解啊,关于性质的证明完全木

bly 1885

全面讲解电子齿轮比与脉冲数计算

什么是编码器分辨率。

viixin的博客 1万+

dos攻击 --hping3

dos使用hping3攻击

qq_65880213的博客 2745

后缀三兄弟之三——后缀自动机(附广义后缀自动机,子序列自动机)

什么是后缀自动机 温馨提醒:以下概念比较晕人,请保持耐心. 后缀自动机是一个有向无环图,节点为状态,有向边为状态转移。其中有一个初始状态可以到达所有状态,若干个结束状态,从初始状态走到一个结束状态,就是原本字符串的一个后缀。 可接受节点:若p是一个可接受节点,那么从root到p的每条路径上的字符组成的字符串,都是当前串的一个后缀。因此,在加入一个新字符时,这个节点后面可以连一个新节...

litble的成(tui)长(fei)史 4076

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

后缀自动机 初学

首先膜拜clj的ppt,记录几个要点 关于Right集合:     1.定义:一个子串str在母串S中所有出现位置的右端点。如子串str在S中出现位置为[l1,r1),[l2,r2),...,[ln,r3),则str的Right集合为{r1..rn}。会有一些子串的Right集合相同,其中最长的len为MAX(s),最短的为MIN(s)     2.性质1:给定Right(s)和len就可得

lych的博客 4132

深空探测处理软件USGS-ISIS的下载安装

深空探测处理软件USGS-ISIS下载安装教程

qq_31721595的博客 3310

不用写触发器!帆软填报报表自动记录创建/修改时间的终极方案

本文详细介绍了帆软填报报表中无需编写数据库触发器,即可自动记录数据创建时间和修改时间的终极方案。该方案利用帆软内置函数和单元格条件属性,在应用层实现日期自动生成,有效规避了触发器带来的权限、维护和部署难题,为数据填报提供了更轻量、灵活且易于维护的解决方案。

weixin_28040125的博客 358

后缀自动机超详细

endpos。

qq_53237241的博客 1422

激光雷达点云异常现象详解:鬼影、高反膨胀与拖点

现象核心外观主要成因核心硬件对策核心算法对策鬼影位置错误,出现"复制"的物体镜面反射/光学元件间杂散光物理光阑、抗反射涂层多帧时序一致性检验、反射率逻辑判断膨胀尺寸变大,轮廓呈毛刺状信号饱和、像素/通道串扰可变增益控制、随机编码序列强度阈值滤波、几何轮廓拟合(剪裁)拖点边缘粘连,出现"阶梯"或"连线"光斑跨立边缘、双回波融合小光斑光学设计、多回波支持邻域深度突变检测、波形脉宽分析这些异常现象是当前激光雷达感知中的核心难点,通常需要硬件物理特性优化与上层感知算法。

Fun_LiDAR的博客 299

后缀自动机(SAM)

后缀自动机

qq_51274548的博客 2724

快速生成2D卡通人物的AI工具:开启Live2D角色创作的新时代

随着这一创新工具的推出,我们正见证着Live2D角色创作进入了一个全新的阶段。它不仅极大地简化了角色设计的过程,也为广大创作者提供了一种全新的表达方式。对于那些渴望将脑海中的构思迅速转化为现实的人来说,这无疑是一大福音。现在就访问项目主页,开始探索无限可能吧!t=O83A项目主页https://human3daigc.github.io/Textoon_webpage/

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 4831

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【学习笔记】后缀自动机SAM

学了 24 个小时都没学懂……

七代目鸽影 4243

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

后缀自动机详解

原论文(俄文)地址:suffix_automata   后缀自动机   后缀自动机(单词的有向无环图)——是一种强有力的数据结构,让你能够解决许多字符串问题。 例如,使用后缀自动机可以在某一字符串中搜索另一字符串的所有出现位置,或者计算不同子串的个数——这都能在线性 时间内解决。   直觉上,后缀自动机可以被理解为所有子串的简明信息。一个重要的事实是,后缀自动机以压缩后的形式包含了一...

DZYO的博客 4万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

广义后缀自动机

广义后缀自动机: 传统后缀自动机是解决单个主串的匹配问题,广义后缀自动机可以用来解决多个主串的匹配问题。

若世界是黑暗,那我便是黎明。 弱者为何而战!? 7901

我终于学会了后缀自动机。

3个月前就说要学,结果真实拖到今天。 有些东西火候不到是真的学不会…………. 网上的教程不算多,而且大部分都是翻译作品,对自动机内各个部位的叫法五花八门,比如自动机里虚边,就有叫link(后缀链接),pre指针,fa数组(我真的不知道fa是什么的缩写)的,记录步数的有叫len的,step的(这俩倒是好理解),状态转移的有叫next的,叫trans的还有叫ch数组的(再次对大佬的起名能力感到震惊...

Cymbals的博客 5951

后缀自动机(SAM)& 广义后缀自动机

一、模板 1.后缀自动机 2.广义后缀自动机 二、题目 1.CF gym100956 K 2.(SPOJ8222) 3.(SPOJ) LCS(最长公共子串) 4.(SPOJ) LCS2 5.牛客多校2020第2场A 6.[SCOI2012]喵星球上的点名

micaudience的博客 657

后缀自动机解决各类问题

后缀自动机是能存储和识别一个字符串S的所有后缀的自动机,是一个有向无环图。endpos 实际上是一个集合。具体而言,endpos 是 的字串 在 中出现位置的末尾的集合。 因此,根据定义,显然有性质:(下面简写 endpos 为edp, 表示字串 的 edp 集合,所有 edp 集合相同的字串所构成的集合成为 edp 等价类)我们发现一个 edp 等价类里的所有字串具有类似的性质,因此我们考虑将所有 edp 等价类的字串变成一个点来看待。后缀自动机的巧妙处:用路径表示子串由于一个 edp 等价类中所

2301_80812282的博客 559

后缀自动机的理解

不懂什么叫目录标题的目录标题后缀自动机的预备知识position end set功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入...

a465798176的博客 936
上一篇: 树链剖分
下一篇: 树的点分治
acmer_zp
博客等级 码龄11年 18粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值