建立SAM,求出每一个节点最左边的出现位置(即right集合中的最小元素,在树上dfs即可)
枚举左端点i和右端点j(保证j是最小的满足$s[i,j)$不是$s[0,i)$的子串),维护k表示$s[i,j)$所对应的位置,$i+1$可以通过找到$nex[k]$来实现,$j+1$直接在SAM上走即可,显然j单调不减,利用单调性维护即可
求出每一个i所对应的j后,可以直接用区间修改在线段树上做,但由于i单调不减,因此从上一个赋值的位置到这里暴力即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 vector<int>v[N];
8 int V,las,n,nex[N],len[N],mn[N],ch[N][2],f[N<<2];
9 char s[N];
10 void add(int c){
11 int p=las,np=las=++V;
12 len[np]=len[p]+1;
13 while ((p)&&(!ch[p][c])){
14 ch[p][c]=np;
15 p=nex[p];
16 }
17 if (!p)nex[np]=1;
18 else{
19 int q=ch[p][c];
20 if (len[q]==len[p]+1)nex[np]=q;
21 else{
22 int nq=++V;
23 len[nq]=len[p]+1;
24 nex[nq]=nex[q];
25 nex[q]=nex[np]=nq;
26 memcpy(ch[nq],ch[q],sizeof(ch[q]));
27 while ((p)&&(ch[p][c]==q)){
28 ch[p][c]=nq;
29 p=nex[p];
30 }
31 }
32 }
33 }
34 void dfs(int k){
35 for(int i=0;i<v[k].size();i++){
36 dfs(v[k][i]);
37 mn[k]=min(mn[k],mn[v[k][i]]);
38 }
39 }
40 void down(int k){
41 f[L]=min(f[L],f[k]);
42 f[R]=min(f[R],f[k]);
43 }
44 void update(int k,int l,int r,int x,int y,int z){
45 if ((l>y)||(x>r))return;
46 if ((x<=l)&&(r<=y)){
47 f[k]=min(f[k],z);
48 return;
49 }
50 update(L,l,mid,x,y,z);
51 update(R,mid+1,r,x,y,z);
52 }
53 void query(int k,int l,int r){
54 if (l==r){
55 printf("%d\n",max(l-f[k],0));
56 return;
57 }
58 down(k);
59 query(L,l,mid);
60 query(R,mid+1,r);
61 }
62 int main(){
63 scanf("%s",s);
64 n=strlen(s);
65 V=las=1;
66 memset(mn,0x3f,sizeof(mn));
67 for(int i=0;i<n;i++){
68 add(s[i]-'0');
69 mn[las]=i;
70 }
71 for(int i=2;i<=V;i++)v[nex[i]].push_back(i);
72 dfs(1);
73 memset(f,0x3f,sizeof(f));
74 for(int i=0,j=0,k=1;i<n;j=max(j,++i)){
75 for(;(j<n)&&(mn[ch[k][s[j]-'0']]<i);k=ch[k][s[j++]-'0']);
76 if (i<j)update(1,1,n,i+1,j,i);
77 if ((k>1)&&(j-i-1<=len[nex[k]]))k=nex[k];
78 }
79 query(1,1,n);
80 }

[noi1760]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常用命令详解 ...

随机推荐

  1. Linux中的文件使用FTP进行文件备份

    注意!!! 本文是在linux中进行ftp备份(备份到另一个linux服务器) 上传思路: 1.每次上传文件时, 后台接收文件, 使用transferTo上传到Linux服务器 2.把文件路径 + F ...

  2. bzoj3262陌上花开 (CDQ,BIT)

    题目大意 给定n朵花,每个花有三个属性,定义\(f[i]\)为满足\(a_j \le a_i\)且\(b_j \le b_i\)且\(c_j \le c_i\)的j的数量, 求\(d \in [0,n ...

  3. 如何利用Prometheus监控你的应用(此列子是对于golang sdk进行运用)

    Prometheus作为一套完整的开源监控接近方案,因为其诸多强大的特性以及生态的开放性,俨然已经成为了监控领域的事实标准并在全球范围内得到了广泛的部署应用.那么应该如何利用Prometheus对我们 ...

  4. nginx源码编译安装(详解)

    nginx编译安装 安装步骤: 官网下载合适的版本,建议选择稳定版本. 官网地址:https://nginx.org wget https://nginx.org/download/nginx-1.2 ...

  5. Docker--harbor私有仓库部署与管理

    目录 一.Harbor简介 二.Harbor 部署 三.维护管理Harbor  一.Harbor简介 1.什么是Harbor  ? Harbor 是 VMware 公司开源的企业级 Docker Re ...

  6. Redis 高阶数据类型重温

    今天这个专题接着上一篇 Redis 的基本数据类型 继续讲解剩下的高阶数据类型:BitMap.HyperLogLog 和 GEO hash.这些数据结构的底层也都是基于我们前面说的 5 种 基本类型, ...

  7. [源码解析] PyTorch如何实现前向传播(3) --- 具体实现

    [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 目录 [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 0x00 摘要 0x01 计算图 1.1 图的相关类 ...

  8. HttpRunner3.X - 实现参数化驱动

    一.前言 HttpRunner3.X支持三种方式的参数化,参数名称的定义分为两种情况: 独立参数单独进行定义: 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接. 数据源指定支持三 ...

  9. VS Code Remote SSH设置

    本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...

  10. 974.和可被K整除的子数组

    题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满足其元 ...