后缀自动机能识别字符串S的所有子串,是一个DAG。

http://blog.csdn.net/huanghongxun/article/details/51112764

https://blog.xehoth.cc/SuffixAutomation/#一些性质

hihocoder上的一堆SAM入门教程挺友好的。

附SAM模板

 const int N = 1e6+;
struct SAM{
//pre[]: parent树, pre[i]是i的后缀, 字符串长度小于i
//son[][]: trans DAG图
//ml[]: maxlen, min[i] = max[pre[i]]+1, 不同的字符串个数是maxlen-minlen+1
int tot, last, pre[N<<], son[N<<][], ml[N<<];
void init() {
tot = , last = ;
memset(son[], , sizeof son[]);
}
void extend(char c){
int w = c-'a', p = ++tot, x = last, r, q;
memset(son[p], , sizeof son[p]);
for(ml[last = p] = ml[x]+; x&&!son[x][w]; x = pre[x]) son[x][w] = p;
if(!x) pre[p] = ;
else if(ml[x]+ == ml[q = son[x][w]]) pre[p] = q;
else{
pre[r = ++tot] = pre[q];
memcpy(son[r], son[q], sizeof son[r]);
ml[r] = ml[x]+;
pre[p] = pre[q] = r;
for(; x&&son[x][w] == q; x = pre[x]) son[x][w] = r;
}
}
};

结点:

后缀自动机的节点表示一类不同的子串,它们在原串中出现的位置的Ri全部相同。(Right集合相同)

节点的属性就是1. Right集   2.长度区间[min(s), max(s)] (表示该节点表示的子串的长度范围)。

边:

边分两类,转移边与parent边。

转移边就是读入下一个字符后跳转的结点。故转移过去的节点对应的字符串集合至少包含原节点的字符串集添加字符。

parent边就是fail边,每次经fail边跳转后,max(fa(s))=min(s)−1,一个节点及其父节点的代表的串有相同的后缀

沿trans图前行,节点对应的字符串集合变大;

沿parent树回溯,节点对应字符串长度区间[minlen, maxlen] -> [?, minlen-1],right集合变大

节点对应的不同子串数 = maxlen-minlen+1 (所有不同子串数 = 各节点求和 = 从root出发的可行路径条数(dp) )

节点对应的字符串在原串中出现的次数 = 节点对应的right集合大小 = trans图中节点走到终点态的方案数 = parent树中子树在主链上的节点数

循环同构字符串处理技巧: 构造s0...sn-1s0...sn-2

如何求s, t的最长公共子串?

构造出s的SAM,用t在SAM上跑,维护当前匹配的最长长度len,

读入一个字符,

若沿trans图有对应边,则len = len+1;

否则沿parent树回溯,则len = maxlen

然后要理解后缀自动机的节点数不超过2n−1(n≥3), 转移数不超过3n−3条。

(转移数想的时间比较久。首先因为只有n个后缀,故出度为0的点不超过n个。那么假设只有2n-2条边,构成一棵生成树,那么每再加入一条边a -> b,我们都能有一条root -> a - > b -> end的路径,表示某一后缀。

root -> a, b -> end都是生成树上的边。那么加入的边不会超过n个就能构造出所有后缀。经过从具体请戳第一个链接)

=======================================================================================

应用:http://blog.csdn.net/huanghongxun/article/details/51112764

SAM的更多相关文章

  1. SAM初探

    SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...

  2. bzoj4199:NOI2015D2T2品酒大会(SAM版)

    SAM感觉写起来比SA更直观(?) #include <iostream> #include <cstdio> #include <cstring> #includ ...

  3. SAM/BAM文件处理

    当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件 ...

  4. hihocoder SAM基础概念

    后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称 ...

  5. bam/sam格式说明

    在SAM输出的结果中每一行都包括十二项通过Tab分隔,从左到右分别是: 1 序列的名字(Read的名字) 2 概括出一个合适的标记,各个数字分别代表 1     序列是一对序列中的一个 2     比 ...

  6. mismatch位置(MD tag)- sam/bam格式解读进阶

    这算是第二讲了,前面一讲是:Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶 MD是mismatch位置的字符串的表示形式,貌似在call SNP和indel的时候会用 ...

  7. Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶

    sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过b ...

  8. pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)

    在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.bcf文件.目前已经有一些主流的处理此类格式文件的工具,如samtools.picard.vcftools.bcftools,但此 ...

  9. SAM格式 及 比对工具之 samtools 使用方法

    参考资料: SAMtools(官网) SAM Spec v1.4 (SAM格式 说明书) (重要) samtools-1.3.1 使用手册 (SAMtools软件说明书) samtools常用命令详解 ...

  10. [转]后缀自动机(SAM)

    原文地址:http://blog.sina.com.cn/s/blog_8fcd775901019mi4.html 感觉自己看这个终于觉得能看懂了!也能感受到后缀自动机究竟是一种怎样进行的数据结构了. ...

随机推荐

  1. JMeter的__threadGroupName使用注意事项

    JMeter从4.1版本开始引入了一个新函数"${__threadGroupName}",这个函数的作用是返回当前线程组的名字.${__threadGroupName}的用途也较为 ...

  2. Jmeter接口测试(五)变量及参数化

    在请求过程中,有时我们需要在请求中设置一些变量来测试不同的场景. 提示:在调试请求过程中,无关的请求可以暂时禁用掉,选择某个暂时不用的请求,右键--禁用 Jmeter 支持以下类型变量:所有类型的变量 ...

  3. CDN的基本原理和基础架构

    CDN基本原理 最简单的CDN网络由一个DNS服务器和几台缓存服务器组成: ①当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DN ...

  4. hive的优化

    hive.optimize.cp=true:列裁剪hive.optimize.prunner:分区裁剪hive.limit.optimize.enable=true:优化LIMIT n语句hive.l ...

  5. Netty源码分析第4章(pipeline)---->第5节: 传播outbound事件

    Netty源码分析第五章: pipeline 第五节: 传播outBound事件 了解了inbound事件的传播过程, 对于学习outbound事件传输的流程, 也不会太困难 在我们业务代码中, 有可 ...

  6. kubernetes高可用设计-master节点和kubectl

    部署master 节点 上一遍是CA证书和etcd的部署,这一篇继续搭建k8s,废话不多说.开始部署. kubernetes master 节点包含的组件有: kube-apiserver kube- ...

  7. 搭建Harbor私有镜像仓库--v1.5.1

     搭建Harbor私有镜像仓库--v1.5.1 1.介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境 ...

  8. 【Ansible】ansible循环

    Ansible 循环 一.简单介绍 在ansible2.5之前,大多数人使”with_XXX”类型的关键字来操作循环,但是从2.6版本开始,官方推荐是”loop”关键字代替” with_XXX”. 1 ...

  9. Vue03

    5.组件化开发 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,因此就产生了把一个功能相关的[HTML ...

  10. LINUX开发使用的3个远程工具

    1,SecureCRT 2,SSH Secure Shell Client 3,VNC Viewer 如果想VNC Server启动时加载vncserver服务 需要修改/etc/rc.d/rc.lo ...