“写sam是肯定会去写的,这样才学的了字符串,后缀数组又不会用 >ω<,

sam套上数据结构的感觉就像回家一样!

里面又能剖分又能线段树合并,调试又好调,我爱死这种写法了 !qwq”

SAM是一个DFA,它存储了某字符串的所有子串信息。

待更。

博主水平不行,尽量在退役前多更些。

插入字符:

 void extend(int id,int&now)
{
int p=now;
if(ch[p][id] && len[ch[p][id]]==len[p]+)
{
now=ch[p][id];
return;
}
int np=++tot;
len[np]=len[p]+;
while(p && !ch[p][id])
{
ch[p][id]=np;
p=fa[p];
}
if(!p)
{
fa[np]=;
}
else
{
int q=ch[p][id];
if(len[q]==len[p]+)
{
fa[np]=q;
}
else
{
int nq=++tot;
len[nq]=len[p]+;
fa[nq]=fa[q];
for(int i=;i<;i++)
ch[nq][i]=ch[q][i];
fa[q]=fa[np]=nq;
while(p && ch[p][id]==q)
{
ch[p][id]=nq;
p=fa[p];
}
}
}
now=np;
}

套路:

每条路径与子串一一对应。

$len_i$:该节点最长串的长度

$Parent Tree$上的子树和:串的出现次数

$len_i - len_{fa_i}$:该节点代表的串的数目

部分题目选:

(1)[SAM入门题][NOI2018]你的名字

题目链接

线段树合并维护$right$集合

(2)[SAM入门题][CTSC2012]熟悉的文章

题目链接

$SAM$只是用来预处理的,求答案还要靠二分+单队$DP$

(3)[SAM入门题][bzoj2555]Substring

题目链接

$LCT$对$Parent Tree$结构的维护

(4)[bzoj3277]字符串

题目链接

广义后缀自动机的应用

暴力搞复杂度大概是根号的,不会证明。

(5)[bzoj5084]HASHIT

题目链接

带撤销后缀自动机,随机数据随便艹。

upd:BFS建树形后缀树以后再进行DFS+树链求并统计答案就行了。

(6)[USACO]牛奶模式

题目链接

后缀自动机的基本原理与使用

(7)[洛谷元旦赛]WD与数列

题目链接

维护$right$集合的好题(似乎还要在parent树上跑启发式合并计算贡献,我并不会)

现在可能会了。

(8)[FZOJ2258]封印

校内题目,没连接

大概就是你知道$Parent$树是干啥的,形态如何,就能直接切掉。

(9)[TJOI2016]字符串

考虑求出 sam 上一个串 p 在 [l,r] 里出现的次数,这个可以通过数一数 p 的 right 集合里有多少在 $[l+len_p-1,r]$ 中出现。

lcp 可以二分,倍增可以从区间 locate 子串,那么这个题就 $O(n\log^2 n)$ 了。

upd:话说为啥没见过把状态设在sam节点上的DP题?

upd:CF700E,已经单独更新

(10)[十二省联考]字符串问题

题目意思大概是描述给你一个连边关系,求 DAG 上最长路。

直接暴力构图可以 $n^2$ ,用 hash 判断。

如果考虑建后缀树,那么在一个节点上有短->长的后缀关系,另外父子关系也是后缀关系,拆点据此连边即可。

只需要实现对区间 locate 子串即可,时间复杂度 $O(n\log n)$。

SAM(后缀自动机)总结的更多相关文章

  1. Distinct Substrings(spoj694)(sam(后缀自动机)||sa(后缀数组))

    Given a string, we need to find the total number of its distinct substrings. Input \(T-\) number of ...

  2. 弦论(tjoi2015,bzoj3998)(sam(后缀自动机))

    对于一个给定长度为\(N\)的字符串,求它的第\(K\)小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串\(S\) 第二行为两个整数\(T\)和\(K\),\(T\)为0则表示不同 ...

  3. LCS2 - Longest Common Substring II(spoj1812)(sam(后缀自动机)+多串LCS)

    A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\ ...

  4. LCS - Longest Common Substring(spoj1811) (sam(后缀自动机)+LCS)

    A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\ ...

  5. Lexicographical Substring Search (spoj7259) (sam(后缀自动机)+第k小子串)

    Little Daniel loves to play with strings! He always finds different ways to have fun with strings! K ...

  6. Substrings(SPOJ8222) (sam(后缀自动机))

    You are given a string \(S\) which consists of 250000 lowercase latin letters at most. We define \(F ...

  7. sam(后缀自动机)

    后缀自动机ins解释 void ins(int c){ int p=last;//将当前节点的parent节点变为last int np=++cnt;//建立新节点 last=np;//将last设为 ...

  8. Luogu P3346 [ZJOI2015]诸神眷顾的幻想乡 广义SAM 后缀自动机

    题目链接 \(Click\) \(Here\) 真的是好题啊-不过在说做法之前先强调几个自己总是掉的坑点. 更新节点永远记不住往上跳\(p = fa[p]\) 新建节点永远记不住\(len[y] = ...

  9. 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)

    佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...

  10. 后缀自动机SAM学习笔记

    前言(2019.1.6) 已经是二周目了呢... 之前还是有一些东西没有理解到位 重新写一下吧 后缀自动机的一些基本概念 参考资料和例子 from hihocoder DZYO神仙翻译的神仙论文 简而 ...

随机推荐

  1. C语言程序设计100例之(28):直线蛇形阵

    例28        直线蛇形阵 问题描述 编写程序,将自然数1.2.….N2按蛇形方式逐个顺序存入N阶方阵.例如,当N=3和N=4时的直线蛇形阵如下图1所示. 图1  直线蛇形阵 输入格式 一个正整 ...

  2. Gym-TORCS安装

    系统为Ubuntu16.04来安装Gym-TORCS 安装pip: sudo apt-get install python-pip sudo pip install --upgrade pip 安装p ...

  3. React的React.createElement源码解析(一)

    一.什么是jsx  jsx是语法糖  它是js和html的组合使用  二.为什么用jsx语法 高效定义模版,编译后使用 不会带来性能问题 三.jsx语法转化为js语法  jsx语法通过babel转化为 ...

  4. Java 常见异常及处理方案

    Java 常见异常处理方案 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error: ...

  5. Python - CentOS 下用 yum 安装 pip

    1. 概述 python 安装完成 发现后续需要一个 python 自己的 包管理工具 书上说默认会装, 然后我发现还是没有 命令执行的结果我就不给了, 这个判断起来, 应该是没有太大难度的 2. 环 ...

  6. JVM(三、双亲委派机制)

    javadoc的解释: ClassLoader的每一个实例都会有一个与之关联的父ClassLoader,当被要求去寻找一个类或者资源的时候,ClassLoader的实例就会对于类或者是资源的寻找委托给 ...

  7. Spark原理概述

    原文来自我的个人网站:http://www.itrensheng.com/archives/Spark_basic_knowledge 一. Spark出现的背景 在Spark出现之前,大数据计算引擎 ...

  8. kindeditor文件上传设置文件说明为上传文件名(JSP版)

    编辑器换成kindeditor时发现文件上传后,直接点确定,<a>便签中的内容显示的是文件路径,不是我想要的文件名,我试了百度上的一些设置方法都不行的,百度上大部分都是修改pugins/i ...

  9. Django框架之ORM的相关操作之一对一关系(四)

    ORM中一对一在当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,那么就把不常用的字段单独拿出来做成一张表,然后通过一对一进行关联起来.举个例子:在我们登录某个账户的时候,一般会显示 ...

  10. 吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:Bellman函数、贪心算法与增强性学习网络开发实践

    !pip install gym import random import numpy as np import matplotlib.pyplot as plt from keras.layers ...