后缀自动机(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
某神犇:"初三还不会后缀自动机,那就退役吧!" 听到这句话后,我的内心是崩溃的. 我还年轻,我还不想退役--于是,我在后来,努力地学习后缀自动机. 终于,赶在初三开学前,我终于学会 ...
随机推荐
- ASP.NET Webform或者ASP.NET MVC站点部署到IIS下,默认情况下.json文件是不能被访问的,如果请求访问.json文件,则会出现找不到文件的404错误提示
解决方法 <system.webServer> <staticContent> <remove fileExtension=".woff" /> ...
- Android平台的四大天王:Activity, Service, ContentProvider, BroadcastReceiver
今天开始要自学android,刚看到百度知道上面这段话,觉得不错(不过已经是2011年8月的回答了): Android系统的手机的每一个你能看到的画面都是一个activity,它像是一个画布,随你在上 ...
- Struts2默认拦截器配置
http://blog.csdn.net/axin66ok/article/details/7321430
- SQL Server Management Studio的对象资源管理器的使用
1.查看 2.对象资源管理器 3.点到某个表的身上 4.出现以下图片,因为有时动态创建的触发器,刷新表下面的触发器可能不出来,所以来这里面找
- 【转】iOS开发网络篇—发送json数据给服务器以及多值参数
原文: http://www.cnblogs.com/wendingding/p/3950132.html 一.发送JSON数据给服务器 发送JSON数据给服务器的步骤: (1)一定要使用POST请求 ...
- OC - 28.模拟时钟
效果图 实现思路 该示例通过隐式动画实现 表盘通过显示在imageView中的一张图片来实现 在表盘上绘制(时分秒)三条直线,分别位于不同的图层,且时针位于最下层,秒针位于最上层 设置直线为圆角 直线 ...
- ios里面如何压缩图片
在iOS里面,压缩图片跟在其他环境里面差不多,都和累死, 就是对当前图片从新画图,制定一个尺寸的问题 UIImage* image = [UIImage imageNamed:@"cat.j ...
- Tomcat 8熵池阻塞变慢详解(转)
Tomcat 8熵池阻塞变慢详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息: ...
- table强制不换行
用iframe做了一个查询,里面有一个表格,结果当页面内容多的时候挤在了一起. 上图:
- PHPCMS(2)PHPCMS V9 环境搭建(转)
转自:http://www.cnblogs.com/Braveliu/p/5072920.html PHPCMS V9的学习总结分为以下几点: [1]PHPCMS 简介 PHP原始为Personal ...