子序列自动机学习笔记
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|)\\)。
更快的离线算法
上面的做法适用面更广,但是如果我们允许离线,是否存在更优秀的算法呢?
实际上,我们只需要把询问挂在它的第一个值上面,然后把序列从前往后扫一遍,每次把当前值对应的询问转移到下一个值就可以了。
这样的复杂度是 \\(O(|S|+\\sum|T|+|\\Sigma|)\\)。
例题
以上是关于子序列自动机学习笔记的主要内容,如果未能解决你的问题,请参考以下文章