首页 > 其他分享 >SAM

SAM

时间:2023-03-23 18:22:58浏览次数:26  
标签:SAM len 集合 父亲 endpos np 节点

有点忘了。省选前来复习下。

一个节点有几个信息:父亲。表示 \(endpos\) 集合最小的,且是当前节点 \(endpos\) 集合超集的节点。转移状态(儿子),表示加入某个字符能转移到的位置。\(len\),表示节点表示的这些子串的最长长度。

考虑构建。首先有一个根(表示空集)。

每次插入一个字符 \(c\),新建一个节点 \(np\) 来表示目前整个串的状态。\(np\) 的长度显然是目前。

然后从插入前表示整个串的节点 \(last\) 开始往上跳,将跳到的所有点的 \(c\) 这个儿子全部设成 \(np\),直到跳到根或者有一个节点有 \(c\) 这个儿子为止。

如果跳到了根,把 \(np\) 的父亲设为根即可。

如果跳到一个非根节点,继续分类讨论。

设这个点是 \(p\),其通过 \(c\) 这个儿子转移到的点是 \(q\)。

如果这个 \(len_p+1=len_q\),那么直接将 \(np\) 的父亲设为 \(q\)。

否则新建节点 \(nq\),初始所有状态全部和 \(q\) 相同,然后将其长度设为 \(len_p+1\),并将 \(q\) 和 \(np\) 的父亲设为他即可。同时注意跳父亲把所有 \(c\) 儿子是 \(q\) 的替换成 \(nq\)。

后缀自动机可以亿些事情。

首先求 \(endpos\) 集合大小:直接将每次新建的 \(np\) 的 \(endpos\) 集合大小设成 \(1\),然后一个节点的 \(endpos\) 集合大小按节点父亲建立的 parent tree 上的子树的这些 \(1\) 之和。

然后性质是,一个节点的所有儿子的 \(endpos\) 集合不交,且其并集是该节点的 \(endpos\) 的子集(不一定是真子集)。

求两个串的最长公共子串直接建出一个串的后缀自动机然后用另一个串从前往后枚举,存在这个儿子就跳过去,并将计数器加一,不存在就跳父亲,并将计数器设为父亲的 \(len\) 即可。

计算本质不同子串数或字典序第 \(k\) 大子串都是简单的。因为 SAM 上任一条路径跑出来得到的字符串都是唯一的。

首先按照拓扑序逆着算,每次更新一个节点后面的状态数,然后算本质不同数是简单的,算字典序第 \(k\) 大就直接从小到大枚举字符看能否走过去即可。非严格第 \(k\) 大需要将计算过程中的 1 改成 \(endpos\) 集合大小。

标签:SAM,len,集合,父亲,endpos,np,节点
From: https://www.cnblogs.com/infinities/p/17248434.html

相关文章

  • Masa Framework源码解读-03 MasaMinimalApi设计
    序言​ 相信大家可能或多或少都了解过微软官方的MinimalApi,最开始刚出来那会我其实对MinimalApi是嗤之以鼻的,因为本身有Controller控制器能够明确定义请求方法出来......
  • 网络系统管理Linux环境——17.StorageSrv之SAMBA
    题目要求服务器AppSrv上的工作任务4. SAMBA创建zhangsan和lisi用户用于测试文件共享;创建samba共享,本地目录为/data/share1,要求:共享名为share1。仅允许zhangsan用户能上传......
  • MySQL中myisam与innodb的区别
    MyISAM不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作对整个表加锁;存储表的总行数;一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;采用非聚集索引,索......
  • SAM咸化
    就本着认真负责的态度来一点SAM咸化吧。其实是杜教筛推不动了来划水了。刚开始学SAM的时候,翻遍了各种博客和题解,但是都没有看太懂。直到后来去借助某可视化网站,一点一点......
  • SAM化咸
    同样是本着认真负责的态度。麻了今天的多项式式子也推不动。我们来到了SAM咸化第二弹!本文章同样只是浅层讲解,大致理解精神即可。主要是分析例题,理解一下\(parent\)树......
  • 实现文件共享----nfs与Samba
     ......
  • 实现文件共享——NFS与Samba
     ......
  • 实现文件共享——nfs与samba
     ......
  • pandas.DataFrame.sample和pandas.DataFrame.reset_index函数
    pandas.DataFrame.sample-从DataFrame或Series对象中随机取样DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None, ......
  • 【ArcPy】输出Samples工具箱样式的面坐标txt文件
    基于ArcGIS10.1,别有用处。importarcpylyr=file=r"C:\Users\dell\Desktop\dapo.txt"withopen(file,'w')astxt:txt.write('Polygon\r\n')witharcpy.da.......