后缀自动机(SAM)模板
struct SAM{
int ch[maxn][],fa[maxn],len[maxn],cnt,last;
void Init()
{
memset(ch,,sizeof(ch));
memset(fa,,sizeof(fa));
last=cnt=;
}
void Add(int c)
{
int p=last,np=last=++cnt;
len[np]=len[p]+;
while(!ch[p][c]&&p){
ch[p][c]=np;p=fa[p];
}
if(p==)
fa[np]=;
else{
int q=ch[p][c];
if(len[p]==len[q]-){
fa[np]=q;
}
else{
int nq=++cnt;len[nq]=len[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];fa[q]=fa[np]=nq;
while(ch[p][c]==q&&p){
ch[p][c]=nq;
p=fa[p];
}
}
}
}
};
然后是自整理最全SAM模版,超级大杀器!
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=;
char s[N];
int fa[N],pos[N],vis[N],sa[N],rank[N];
int son[N][],end[N],rht[N],lcp[N];
int ch[N][],len[N],id[N],tot;
int od[N],wv[N],lst,cnt; void Init(){
memset(ch,,sizeof(ch));
memset(end,,sizeof(end));
memset(son,,sizeof(son));
memset(vis,,sizeof(vis));
lst=cnt=;tot=;
} void Insert(int c){
int p=lst,np=lst=++cnt;end[lst]=;
id[len[np]=len[p]+]=np;rht[np]=;
while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];
if(!p)fa[np]=;
else{
int q=ch[p][c],nq;
if(len[q]==len[p]+)fa[np]=q;
else{
len[nq=++cnt]=len[p]+;
fa[nq]=fa[q];fa[q]=fa[np]=nq;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
while(ch[p][c]==q)ch[p][c]=nq,p=fa[p];
}
}
} void Get_Right(){
for(int i=;i<=cnt;i++)wv[len[i]]++;
for(int i=;i<=cnt;i++)wv[i]+=wv[i-];
for(int i=;i<=cnt;i++)od[wv[len[i]]--]=i;
for(int i=cnt;i>=;i--)rht[fa[od[i]]]+=rht[od[i]];
} void Build_Tree(){
int l=strlen(s+);
for(int i=l;i>=;i--)Insert(s[i]-'a');
for(int i=l;i>=;i--)
for(int x=id[i],p=l+;x&&!pos[x];x=fa[x])
p-=len[x]-len[fa[x]],pos[x]=p;
for(int x=;x<=cnt;x++)son[fa[x]][s[pos[x]]-'a']=x;
} void DFS(int x,int l){
if(end[x])sa[rank[l-len[x]+]=++tot]=l-len[x]+;
for(int i=;i<;i++)if(son[x][i])DFS(son[x][i],l);
} void Build_SA(){
int l=strlen(s+),k=;DFS(,l);
for(int i=,j;i<=l;lcp[rank[i++]]=k)
for(k?k--:k,j=sa[rank[i]-];s[i+k]==s[j+k];k++);
} int main(){
//freopen();
//freopen();
Init();
scanf("%s",s+);
int l=strlen(s+);
Build_Tree();Build_SA();
for(int i=;i<=l;i++)printf("%d ",sa[i]);printf("\n");
for(int i=;i<=l;i++)printf("%d ",lcp[i]);printf("\n");
return ;
}
警告:这里的SAM都是naive-sam,无法跑trie和多串。
后缀自动机(SAM)模板的更多相关文章
- SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)
1811. Longest Common Substring Problem code: LCS A string is finite sequence of characters over a no ...
- 浅谈后缀自动机SAM
一下是蒟蒻的个人想法,并不很严谨,仅供参考,如有缺误,敬请提出 参考资料: 陈立杰原版课件 litble 某大神 某大神 其实课件讲得最详实了 有限状态自动机 我们要学后缀自动机,我们先来了解一下自动 ...
- 后缀自动机(SAM)奶妈式教程
后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...
- [转]后缀自动机(SAM)
原文地址:http://blog.sina.com.cn/s/blog_8fcd775901019mi4.html 感觉自己看这个终于觉得能看懂了!也能感受到后缀自动机究竟是一种怎样进行的数据结构了. ...
- 【算法】后缀自动机(SAM) 初探
[自动机] 有限状态自动机的功能是识别字符串,自动机A能识别字符串S,就记为$A(S)$=true,否则$A(S)$=false. 自动机由$alpha$(字符集),$state$(状态集合),$in ...
- 后缀自动机SAM学习笔记
前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...
- 【算法】后缀自动机(SAM) 例题
算法介绍见:http://www.cnblogs.com/Sakits/p/8232402.html 广义SAM资料:https://www.cnblogs.com/phile/p/4511571.h ...
- 后缀自动机(SAM) 学习笔记
最近学了SAM已经SAM的比较简单的应用,SAM确实不好理解呀,记录一下. 这里提一下后缀自动机比较重要的性质: 1,SAM的点数和边数都是O(n)级别的,但是空间开两倍. 2,SAM每个结点代表一个 ...
- 后缀自动机SAM
某神犇:"初三还不会后缀自动机,那就退役吧!" 听到这句话后,我的内心是崩溃的. 我还年轻,我还不想退役--于是,我在后来,努力地学习后缀自动机. 终于,赶在初三开学前,我终于学会 ...
随机推荐
- 使用Spring简化JDBC操作数据库
Spring的开发初衷是为了减轻企业级开发的复杂度,其对数据库访问的支持亦如此,使用Spring访问数据库能带来以下好处: 1.1 简化代码 使用原生的JDBC访问数据库,一般总是要执行以下步 ...
- 使用Java BigDecimal进行精确运算
首先我们先来看如下代码示例: public class Test_1 { public static void main(String[] args) { System.out ...
- How to Make LastPass Even More Secure with Google Authenticator
Google Authenticator LastPass supports Google Authenticator, which is officially available as an app ...
- PropertyPlaceholderConfigurer的用法(使用spring提供的类读取数据库配置信息.properties)
http://www.cnblogs.com/wanggd/archive/2013/07/04/3172042.html(写的很好)
- 段落排版--对齐(text-aliagn)
想为块状元素中的文本.图片设置居中样式吗?可以使用text-align样式代码,如下代码可实现文本居中显示.(那么什么是块状元素呢?后面会讲到呢~) h1{ text-align:center; } ...
- ios strong weak 的区别 与 理解
先一句话总结:strong类保持他们拥有对象的活着,weak类他们拥有的对象被人家一牵就牵走,被人家一干就干死.(strong是一个好大哥所以strong,呵呵,weak是一个虚大哥所以weak,呵呵 ...
- PictureBox内的图片拖动功能
当 PictureBox内的图片太大,超过PictureBox边框时可以用下面的方法来实现, 通过重绘来实现 : Code bool wselected = false; Point p = ...
- C#入门经典(第五版)学习笔记(四)
---------------集合.比较和转换--------------- C#中的数组是作为System.Array类的实例实现的,它们是集合类(Collection Classes)中的一种类型 ...
- WampServer修改端口及菜单Localhost
一.修改Apache端口 1.在界面中选Apache,弹出隐藏菜单选项,打开配置文件httpd.conf: 2.找到 Listen 80: 3.将 80 改成 8080(当然自己也可以设定别的不使用的 ...
- CSAPP LAB: Buffer Overflow
这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击.实验材料可到我的github仓库 https://github.com/Cheukyin/CSAPP-LAB/ 选择buffer-ov ...