博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SAM初步
阅读量:5035 次
发布时间:2019-06-12

本文共 838 字,大约阅读时间需要 2 分钟。

SAM(Suffix Automaton),后缀自动机。

SAM是种十分神奇的数据结构,我认为他的主要神奇之处,在于最大限度的利用了分类思想。

SAM上有两种边,代表两种转移方式。

一种是树边,一种是转移边,树边代表对SAM对子串出现位置的分类,转移边代表当前节点代表的子串加入字符后的节点的分类。

由于子串的出现位置的集合或者是子集关系,或者无交集,可以证明状态数是O(n)的。

在有了这些东西后,SAM基本可以搞出关于字符串的所有问题。

SAM有句很经典的话:出现次数向父亲传递,接收串数从儿子获取。

 

构造模板:

struct sam{	int pre[maxn],c[maxn][26],len[maxn],q,p,nq,np;	int cnt,now;	sam(){mem1(pre,0);mem1(c,0);mem1(len,0);cnt=now=1;}	void expend(int x){		p=now,np=++cnt;		len[np]=len[now]+1;now=np;		while(p&&!c[p][x])c[p][x]=np,p=pre[p];		if(!p)pre[np]=1;		else {			q=c[p][x];			if(len[q]=len[p]+1)pre[np]=q;			else {				len[nq=++cnt]=len[p]+1;				mem2(c[nq],c[q]);				pre[nq]=pre[q];				pre[np]=pre[q]=nq;				while(p&&c[p][x]==q)c[p][x]=nq,p=pre[p];			}		}	}	void build(char* s){		int n=strlen(s+1);		up(i,1,n)expend(s[i]);	}}SAM;

  

 

转载于:https://www.cnblogs.com/chadinblog/p/6418604.html

你可能感兴趣的文章
hdu 4038 stone
查看>>
ASP.NET 显示项目之外的图片
查看>>
2011数字图书馆前沿问题高级研讨班-学习笔记1
查看>>
深度学习系列 Part(3)
查看>>
HDFS之HBase伪分布安装
查看>>
android 测试----Monkey
查看>>
static 关键字
查看>>
Vue 的基本认识
查看>>
最高的分数
查看>>
命令别名设置: alias, unalias
查看>>
1051. 复数乘法 (15)
查看>>
gcc相关
查看>>
tmp目录
查看>>
Codeforces Round #374 (Div. 2)
查看>>
6个出色的基于JQuery的Tab选项卡实例
查看>>
(转)8款在线CSS优化工具/组织和压缩CSS
查看>>
删除文本文件行号的小方法(shell,sed)
查看>>
table头部、尾部固定;中间内容定高自适应滚动
查看>>
JAVA设计模式之调停者模式
查看>>
[SHELL进阶] (转)最牛B的 Linux Shell 命令 (二)
查看>>