后缀自动机(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
某神犇:"初三还不会后缀自动机,那就退役吧!" 听到这句话后,我的内心是崩溃的. 我还年轻,我还不想退役--于是,我在后来,努力地学习后缀自动机. 终于,赶在初三开学前,我终于学会 ...
随机推荐
- list-style无颜色问题解决,list-style-type无颜色解决
list-style无颜色问题解决,list-style-type无颜色解决 >>>>>>>>>>>>>>>& ...
- MD5 密码破解 碰撞 网站
MD5反向查询网站 http://www.cmd5.com/ 文件MD5值查询网站 http://www.atool.org/file_hash.php 个人对密码破解的理解 1.使用MD5对密码加密 ...
- lucene 抛出的异常(分享)
1) too many boolean clauses异常 例如: String keyword=".......";//(keyword的长度太长) Query indexQue ...
- cocos2dx 各种环境的搭建
http://www.cocos.com/doc/tutorial/index?type=cocos2d-x Windows7上搭建Cocos2d-x 3.4开发环境 这里需要注意的是,如果是搭建VS ...
- PHP 开启报错机制
屏蔽PHP错误提示 方法一:在有可能出错的函数前加@,然后or die("") 如: @mysql_connect(...) or die("Database Conne ...
- 使用Convert 类和Parse方法将字符串转换为数值类型
//用Parse方法将字符串转换为数值类型; long num=Int64.Parse(args[2]) //用别名为Int64c#类型long; long num=long.Parse(args[2 ...
- VS2015 Cordova Ionic移动开发(二)
一.创建空白Cordova应用 打开VS,选择[新建项目],选择其它语言JavaScript或者TypeScript,语言的话就按个人喜好,喜欢JS就用JS,喜欢TS就用TS,推荐使用TS书写,代码结 ...
- IE8下ckeditor无法正常使用,提示"例外被抛出且未被接住"的解决办法
<script language="javascript" src="ckeditor/ckeditor.js"></script> & ...
- ASP.NET实现二级域名(多用户,多商店)
本人所了解有两种方案,可能还有其的方式,希望大家多多讨论! 基本思路: 1. 域名支持泛解析,即是指:把A记录 *.域名.com 解析到服务器IP,服务器IIS中做绑定,绑定时主机头为空; 2. ...
- hdoj 4310 贪心
不知为毛,过不了 我的代码: #include<stdio.h> int main(){ int n,a[30],b[30],temp,i,j,s1,s2; double c[30]; w ...