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

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

时间:2023-04-15 10:44:17浏览次数:52  
标签:cur SAM 后缀 clone maxlen link 自动机 节点

由于本人时间原因,此处只为一个SAM的总结,讨论SAM的基本操作以及性质,详细证明
如要详细学习请查询luogu题解。

算法原理

SAM中每一个节点代表所有结束位置(endpos)相同的串的集合。
每个节点有:1.后缀链接link(到endpos包含它且maxlen最长的那个点,且是为当前点的后缀的点) 2.此点所代表的最长的串的长度(maxlen) 3.走字符 [a-z] 能走到的点(nex[a-z])

SAM的构造:
设上一个节点为last,当前开一个新节点为cur,当前插入的字符为c。
从last一直走它的link直到走到根节点或某点c的出边不为空,将路径上的所有点的c的出边设为cur。
如果走到根节点说明前面没有和它后缀相同的点,于是将cur的link指向根节点。
否则设走到的点为p,p点c出边指向的点为q。
如果 $ maxlen(p)+1 = maxlen(q) $ ,则将cur的link指向q,结束。
否则,考虑q的endpos集合的部分后缀并不是cur集合中的串的后缀。
此时我们需要新建一个辅助节点clone,复制q的所有信息,并将clone的长度改为\(maxlen(p)+1\),再将cur的link指向clone,q的link指向clone。
然而此时还有一个小问题,从cur的link走到的clone并不能由根节点走到clone所代表的endpos的集合,我们需要重定向一些边来使得此性质成立。
于是从p向上走link,将所有当前点c的出边指向q的边重定向到clone,走到第一个点c的出边不指向q的点即可退出。
考虑此时SAM的形态,q的分割为两个集合clone和q,由于clone的maxlen是小于q的,所以clone所代表的所有串是q的后缀。

性质

每个点所代表的是endpos相同的一个集合,串的长度是连续的,且区间在\([maxlen(link[now])+1,maxlen(now)]\),其中的短串为长串的后缀。
从根节点出发能走出所有的子串,走后缀链接能走到所有为当前点后缀的点。
link构成的树是后缀树。
待补

标签:cur,SAM,后缀,clone,maxlen,link,自动机,节点
From: https://www.cnblogs.com/flywatre/p/17320654.html

相关文章

  • 2023-4-14自增前后缀区别
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ inta=39; intb=39; cout<<a<<endl<<b<<endl; a++; ++b; cout<<"oneyearlater...."<<endl; cout<<"a="<<a<<endl<<"......
  • Hibernate_a different object with the same identifier value was already associat
    1、adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession。错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。解决方法一:session.clean()PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据......
  • HDU 2222 Keywords Search (AC自动机)
    题目地址:HDU2222AC自动机第一发!真好奇这些算法是怎么被发明的。。算法的魅力真是无穷。这题是AC自动机模板题。自己实在写不出来,比着kuangbin的模板写的==代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#incl......
  • POJ 1226 Substrings (后缀数组)
    题目地址:POJ1226将每一个字符串反转连接一次,再把所有字符串都连接起来,然后二分,找最大长度。注意与反转字符串之间不能直接相连。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<ma......
  • POJ 2774 Long Long Message (后缀数组)
    题目地址:POJ2774后缀数组第一发!后缀数组真是太神奇了。。(好像每学一种新算法我都会这么说。。原理研究了好长时间,还有代码的实现,论文作者罗穗骞的代码太简洁。。好难看懂QAQ,看了好长时间。来一发后缀数组模板题,模板是用的倍增思想。代码如下:#include<iostream>#include......
  • SPOJ 705 New Distinct Substrings (后缀数组)
    后缀数组模板题。由于height数组是指与排名上一个的公共前缀,所以重复的个数是height[i]个,考虑当前这个字母所构成的子串的贡献即为n-sa[i]-height[i],然后累加即可。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm......
  • 全志v85x 在 eyesee-mpp 中添加一个hello_world sample 的流程
    1.为什么要在eyesee-mpp中添加sample?1)保持整个openwrt应用程序编写的完成性;2)eyesee-mpp中包含了几乎所有全志视频音频模块的sample以及头文件,参考以及头文件调用起来非常方便,而且可以学习各种模块的使用流程;3)可以直接在makemenuconfig中管理应用程序,是否编译;4)不需要将......
  • Ubuntu Server 22.04 安装samba
    1.SSH登录服务器后,先安装cockpit,方便管理存储xzd@xzd:~$sudo-i[sudo]passwordforxzd:root@xzd:~#apt-getinstallcockpit#安装完成后使用ip:9090打开web界面管理,用系统用户名密码登录2.安装Sambaroot@xzd:~#apt-getinstallsamba3.在cockpit中的帐户管理......
  • 利用Samba共享window、Linux文件
    利用Samba共享Linux和window之间的文件1、安装Samba服务器#yum-yinstallsambasamba-client2、创建共享目录及更改权限#mkdirSharedir//自己取一个喜欢的名字#chmod777Sharedir-R//给的是最高读写权限,请根据实际需要给相应的权限3、添加用户#useraddTunan/......
  • Meta AI 开源万物可分割 AI 模型(SAM)
    开始4月6日,根据MetaAI官方博客,MetaAI宣布推出了一个AI模型SegmentAnythingModel(SAM,分割一切模型)。据介绍,该模型能够根据文本指令等方式实现图像分割,而且万物皆可识别和一键抠图。github源码地址:facebookresearch/segment-anything官方网站体验地址:segment-anythin......