SAM
后缀自动机能识别字符串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的更多相关文章
- SAM初探
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...
- bzoj4199:NOI2015D2T2品酒大会(SAM版)
SAM感觉写起来比SA更直观(?) #include <iostream> #include <cstdio> #include <cstring> #includ ...
- SAM/BAM文件处理
当测序得到的fastq文件map到基因组之后,我们通常会得到一个sam或者bam为扩展名的文件.SAM的全称是sequence alignment/map format.而BAM就是SAM的二进制文件 ...
- hihocoder SAM基础概念
后缀自动机一·基本概念 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称 ...
- bam/sam格式说明
在SAM输出的结果中每一行都包括十二项通过Tab分隔,从左到右分别是: 1 序列的名字(Read的名字) 2 概括出一个合适的标记,各个数字分别代表 1 序列是一对序列中的一个 2 比 ...
- mismatch位置(MD tag)- sam/bam格式解读进阶
这算是第二讲了,前面一讲是:Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶 MD是mismatch位置的字符串的表示形式,貌似在call SNP和indel的时候会用 ...
- Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶
sam格式很精炼,几乎包含了比对的所有信息,我们平常用到的信息很少,但特殊情况下,我们会用到一些较为生僻的信息,关于这些信息sam官方文档的介绍比较精简,直接看估计很难看懂. 今天要介绍的是如何通过b ...
- pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)
在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.bcf文件.目前已经有一些主流的处理此类格式文件的工具,如samtools.picard.vcftools.bcftools,但此 ...
- SAM格式 及 比对工具之 samtools 使用方法
参考资料: SAMtools(官网) SAM Spec v1.4 (SAM格式 说明书) (重要) samtools-1.3.1 使用手册 (SAMtools软件说明书) samtools常用命令详解 ...
- [转]后缀自动机(SAM)
原文地址:http://blog.sina.com.cn/s/blog_8fcd775901019mi4.html 感觉自己看这个终于觉得能看懂了!也能感受到后缀自动机究竟是一种怎样进行的数据结构了. ...
随机推荐
- ffmpeg——关于视频压缩
这篇博客主要讲有关于视频压缩的问题,解决视频文件太大,不便于下载,占用存储空间过大等问题,在缩小视频大小的同时,保证视频的观看质量.主要讲以下几点: 1.压缩视频工具ffmpeg 2.压缩视频的技术参 ...
- 理解unittest(六)
unittest,顾名思义就是一个单元测试框架,但是它不仅适用于单元测试,还适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成 ...
- Memached、Redis、Mongodb的区别
性能 • 性能都很高,redis和memached差不多 > Mongodb 操作 • Memached:数据结构单一,只有key/value数据结构 • Redis有五种数据类型 ...
- OpenGL 笔记<1> 固定管线实例 + 双缓存测试实例
欲以此分类来记录opengl的学习历程,此为第一篇,所以先来一个固定管线的例子,以及对双缓存的测试. 一.配置环境 写之前,先进行配置,然后再讲内容. 注:第一部分涉及的代码均忽略. [环境配置传送门 ...
- Python之Django的Model详解
一.创建数据库 创建数据库 进入数据库: mysql -uroot -p 创建数据库: CREATE DATABASE test1 CHARSET=utf8; 连接数据库 虚拟环境中安装数据库模块:p ...
- 浅谈ajax同步、异步的问题
最近实习的时候看到过firefox的同步.异步的警告,想着概念不是那么清楚,于是整理了一下ajax同步异步方面的知识.我是小白,做个笔记. 首先就是概念问题,ajax根据async进行区分同步和异步过 ...
- 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties 中配置自己的 IP. 至于为什么要这么做,源于这一次 debug 的过程. 运行环境 mint, ...
- React Native 之 main.jsbundle生成方法
通过react-native init yooweiProject 生成的RN项目(版本基于0.57),目录结构如下 项目结构: 大家可以发现main.jsbundle 是红色的,不存在的,这个属于正 ...
- servlet 和 threadlocal 与 web容器(理解threadlocal)
同步机制采用了“以时间换空间”的方式,提供一份变量,让不同的线程排队访问.而ThreadLocal采用了“以空间换时间”的方式,为每一个线程都提供了一份变量的副本,从而实现同时访问而互不影响. htt ...
- 第十一次PSP