建立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. Midway Serverless 发布 2.0,一体化让前端研发再次提效

    作者 | 张挺 来源 | Serverless 公众号 自去年 Midway Serverless 1.0 发布之后,许多业务开始尝试其中,并利用 Serverless 容器的弹性能力,减少了大量研发 ...

  2. 零基础怎么学Java?Java的运行机制是什么?Java入门基础!

    Java语言是当前流行的一种程序设计语言,因其安全性.平台无关性.性能优异等特点,受到广大编程爱好者的喜爱. 想学习Java语言的同学对于Java的运行机制是必须要了解的!! 计算机高级语言的类型主要 ...

  3. 云原生的弹性 AI 训练系列之三:借助弹性伸缩的 Jupyter Notebook,大幅提高 GPU 利用率

    Jupyter Notebooks 在 Kubernetes 上部署往往需要绑定一张 GPU,而大多数时候 GPU 并没有被使用,因此利用率低下.为了解决这一问题,我们开源了 elastic-jupy ...

  4. Java(3)基本数据类型及其类型转换

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201501.html 博客主页:https://www.cnblogs.com/testero ...

  5. 【UE4 C++】 获取Actor、Controller、Pawn、Character

    获取 Actor TActorIterator 遍历 可以用于遍历 Actor,也可以用于遍历 Component for (TActorIterator<AStaticMeshActor> ...

  6. ffmpeg剪视频

    ffmpeg裁剪合并视频   ffmpeg提供简单的命令参数: ffmpeg -ss START -t DURATION -i INPUT -vcodec copy -acodec copy OUTP ...

  7. Scrum Meeting 13

    第13次例会报告 日期:2021年06月05日 会议主要内容概述: 团队成员均明确了下一步的目标,进度突飞猛进辣 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下 ...

  8. 第四次Scrum Metting

    日期:2021年4月29日 会议主要内容概述:交代近两日工作,进一步细化上次讨论细节,代码合并. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...

  9. [对对子队]Scrum Meeting 博客汇总

    对对子队 博客目录 一.Scrum Meeting 1. Alpha Scrum Meeting 1(会议记录4.10) Scrum Meeting 2(会议记录4.11) Scrum Meeting ...

  10. Spring Cloud Alibaba Nacos Config 的使用

    Spring Cloud Alibaba Nacos Config 的使用 一.需求 二.实现功能 1.加载 product-provider-dev.yaml 配置文件 2.实现配置的自动刷新 3. ...