【文文殿下】后缀自动机(SAM)求最长公共子串的方法

摘要:
我们考虑跳回到其父节点,因为其父节点的右集合是当前状态的真超集,它们是由当前状态表示的字符串集中的所有匹配字符串(它们是否可以是最长的字符串?父节点状态中最长的串必须是合法的,并且最终必须找到一个节点以允许下一个字符传输,同时,len被强制更新为Max(G)(关于是否要+1有一个争论,之前不匹配的角色可能对答案做出了两次贡献?

首先,在A 串上建立一个SAM,然后用B串在上面跑。具体跑的方法是:

从根节点开始,建立一个指针 p ,指着B串的开头,同步移动指针,沿着SAM的边移动,如果可以移动(即存在边)那么万事皆好,直接len++就好,但是,如果无法继续转移(失配了),那么,我们考虑跳回其父节点,因为其父节点的Right集是当前状态的真超集,那么其父节点状态所代表的字符串的集合中的任意一个字符串,都是当前状态所代表的字符串集合中的正在匹配的字符串(会不会一定是最长串?)的后缀,所以,有一个贪心的思想:父节点状态中的最长串一定是合法的,我们顺着父节点找上去,一定最终可以找到一个节点允许下一个字符转移,或者找到了0号节点。

第一种情况:找到了一个合适的状态,那么大家都好,直接从这里继续跑,同时把len强制更新为Max(G)(这里要不要+1有一点争论,如果+1,那么接下来跑串时,之前失配的那个字符可能对答案贡献了2次?,因为跑到下一个状态时,是沿着之前那个失配字符的那条边跑的,这会导致len++,所以我认为这里不应该+1),因为我们之前跑的那个已经成功的串,这里一定取那个已经匹配了的最长后缀,然后接下来继续跑串。

第二中情况:我们无法找到一个状态拥有x这条边,就算是根节点也没有这个边,说明模板串出现了一个原串中没有出现的字符,我们强制更新当前状态为根节点,然后把指针p从字符x挪过去,从他的下一个字符开始匹配。

但实际上,我们没必要考虑第二种情况:我们先预处理模板串,把原串中不存在的字符去掉,把模板串分成一个个小的模板串,然后从最大的模板串跑匹配,记录当前答案,这里有一个显而易见的优化:如果即将跑的模板串长度低于全局答案,那么我们跳过这个模板串。

事实上,len不应该设为Max(G)+1

免责声明:文章转载自《【文文殿下】后缀自动机(SAM)求最长公共子串的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vmware ESXi安装群晖Synology DSM 5.x多表更新:update,join下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SqlLite 简明教程

SQL DML 和 DDL可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。注:"--"双减号为行注释SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。查询和更新指令构成了 SQL 的 DML 部分:SELECT - 从数据库表中获取数据UPDATE - 更新数据库表...

Modbus通讯两种传输方式

控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。 ASCII模式: : 地址 功能代码 数据数量 数据1 ... 数据n LRC高字节 LRC低字节 回车 换行...

hexdump——Linux系统的二进制文件查看工具

hexdump是Linux下的一个二进制文件查看工具,可以将二进制文件转换为ASCII、10进制、16进制或8进制进行查看。 首先我们准备一个测试用的文件test,十六进制如下: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D...

[leetcode]299. Bulls and Cows公牛和母牛

You are playing the following Bulls and Cows game with your friend: You write down a number and ask your friend to guess what the number is. Each time your friend makes a guess, y...

基于C++的模板引擎

模板引擎(Template engine)是实现模型和视图分离的一个重要手段。如果你从未接触过模板引擎可以看看Wiki的介绍。模板引擎的流行最初是因为网站开发的需要,象比较重要的几个模板引擎:SMARTY、Velocity、StringTemplate都是来源于网页设计的。当然,除了网页设计,模板引擎还可以应用于其他领域,而我主要将其应用与代码生成器的设计...

Java关于数组对象赋值与指针

在实现PageRank算法中犯了两个错误, 1:在对double类型赋值时,除法中没有将分母设置为double类型,而是int类型,导致出现商为0的结果错误,导致推迟 2:当定义两个数组时,对数组赋值时,忘记了,数组是对象的特点直接nowRank=resultRank; 其中resultRank又重新赋值,所以导致nowRank中元素值也发生变化,因为数组...