子序列自动机学习笔记

Posted xiaoziyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子序列自动机学习笔记相关的知识,希望对你有一定的参考价值。

一直鸽着这个东西,现在回来学一下。

子序列自动机

P5826 【模板】子序列自动机/P3500 [POI2010]TES-Intelligence Test

我们考虑怎么在某个序列 \\(a\\) 上匹配一个序列 \\(b\\),在匹配字符 \\(c\\) 时只需要每次贪心找到当前匹配位置后面最近的 \\(c\\) 即可,这启发我们设计自动机模型。

字符集为原序列的字符集。

状态集合为位置 \\(1,2,\\cdots,n\\),以及垃圾站 \\(n+1\\)

起始状态为位置 \\(1\\)

接受状态集合为除了 \\(n+1\\) 外的位置。

转移函数为

\\[\\delta(x,c)=\\i\\mid i>x,a_i=c\\ \\]

那么我们只需要从后往前扫一遍就可以得到转移函数了。

由于字符集过大,所以不能存下所有转移函数,所以需要采用可持久线段树,复杂度 \\(O((|S|+\\sum|T|)\\log |S|)\\)

AC 记录

更快的离线算法

上面的做法适用面更广,但是如果我们允许离线,是否存在更优秀的算法呢?

实际上,我们只需要把询问挂在它的第一个值上面,然后把序列从前往后扫一遍,每次把当前值对应的询问转移到下一个值就可以了。

这样的复杂度是 \\(O(|S|+\\sum|T|+|\\Sigma|)\\)

AC 记录

例题

以上是关于子序列自动机学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

python 学习笔记 -- 数据结构与算法 插入排序 Insertion Sort

数据结构学习笔记——顺序存储结构实现串

后缀自动机学习笔记

Python学习笔记__10.1章 多进程

STL学习笔记--4序列式容器之vector

python 学习笔记 -- 数据结构与算法 希尔排序 Shell Sort