序列自动机


在阅读本文之前,请先阅读

自动机

定义

序列自动机是接受且仅接受一个字符串的子序列的自动机。

本文中用 代指这个字符串。

状态

包含 个字符,那么序列自动机包含 个状态。

的一个子序列,那么 中第一次出现时末端的位置。

也就是说,一个状态 表示前缀 的子序列与前缀 的子序列的差集。

序列自动机上的所有状态都是接受状态。

转移

由状态定义可以得到,,也就是字符 下一次出现的位置。

为什么是“下一次”出现的位置呢?因为若 ,后缀 的子序列是后缀 的子序列的子集,一定是选尽量靠前的最优。

实现

从后向前扫描,过程中维护每个字符最前的出现位置:

这样构建的复杂度是

例题

给你两个由小写英文字母组成的串 ,求:

  1. 的一个最短的子串,它不是 的子串;

  2. 的一个最短的子串,它不是 的子序列;

  3. 的一个最短的子序列,它不是 的子串;

  4. 的一个最短的子序列,它不是 的子序列。

这题的 (1) 和 (3) 两问需要后缀自动机,而且做法类似,在这里只讲解 (2) 和 (4) 两问。

(2) 比较简单,枚举 A 的子串输入进 B 的序列自动机,若不接受则计入答案。

(4) 需要 DP。令 表示在 A 的序列自动机中处于状态 ,在 B 的序列自动机中处于状态 ,需要再添加多少个字符能够不是公共子序列。

贡献者:@WenzelTian@kenlig@mgt@Chrogeek@ouuan

本页面最近更新:2/3/2023, 12:00:00 AM更新历史

发现错误?想一起完善? 在 GitHub 上编辑此页!

本页面的全部内容在 CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用

评论

0 条评论
未登录用户


Copyright © 2016 - 2023 OI Wiki Team

最近更新:fd2ec2c, 2023-02-03

联系方式:Telegram 群组 / QQ 群组