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 感觉自己看这个终于觉得能看懂了!也能感受到后缀自动机究竟是一种怎样进行的数据结构了. ...
随机推荐
- APP性能测试--功耗测试
一.功耗测试基础 移动设备的电池电量是非常有限的,保持持久的续航能力尤为重要.另外,android的很多特性都比较耗电(如屏幕,GPS,sensor传感器,唤醒机制,CPU,连网等的使用),我们必须要 ...
- c语言数字图像处理(八):噪声模型及均值滤波器
图像退化/复原过程模型 高斯噪声 PDF(概率密度函数) 生成高斯随机数序列 算法可参考<http://www.doc.ic.ac.uk/~wl/papers/07/csur07dt.pdf&g ...
- 前端开发利器 livereload -- 从此告别浏览器F5键
各位从事前端开发的童鞋们,大家每天coding && coding,然后F5 && F5,今天推荐一个静态文件在浏览器中自动更新的扩展 livereload,不同手动刷 ...
- 搭建好看的静态博客(使用Hexo进行搭建)
经常看到大牛的博客非常的高大帅气,虽然我很渣,但是逼格不能输,所以有了以下的搭建记录. 我的成果ninwoo,喜欢的可以参考下面的记录一起来动手搞起来. 安装Git Bash 访问git下载最新版本的 ...
- Linux加密到K8S中
文件名字 test.conf 加密: base64 --wrap=0 aaa.conf 把得到的密钥填入配置文件当中即可
- 剑指 Offer——连续子数组的最大和
1. 题目 2. 解答 初始化 sum=0,然后遍历数组进行累加.如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加. 初始化 max_sum 为数组的第一个 ...
- c++ undefinede reference to 构造函数/析构函数
g++编译器问题 把头文件"a.h"和头文件实现文件"a.cpp"都include就解决了.
- js传输txt文档内容
要求:实现修改text文档内容,即可将text修改内容传到页面显示: HTML: <!doctype html> <html lang="en"> < ...
- users命令详解
基础命令学习目录 原文链接:https://blog.csdn.net/m0_38132420/article/details/78861464 users命令用于显示当前登录系统所有的用户的用户列表 ...
- Scrum立会报告+燃尽图(十月十一日总第二次):需求分析
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2191 Scrum立会master:张俊余 一.小组介绍 组长:付佳 组员 ...