最短不公共子串(后缀自动机+序列自动机+bfs)

利用后缀自动机解决子串问题,序列自动机处理子序列问题,结合BFS遍历寻找最短不同时属于两个字符串的子串。在BFS过程中,通过vis数组记录已遍历状态,优化复杂度至O(n*∑)。代码实现中,四次BFS可统一处理。

最短不公共子串

题意

问最短的满足:是A的子串(子序列),且不是B的子串(子序列,子序列(子串))。(共四个问题)

思路

  1. 子串问题,考虑后缀自动机;子序列问题,考虑序列自动机;这不就成板子题了?
  2. 然后本题要求属于前者,而不属于后者的子结构,可以考虑暴力的在两种DAG上同时跑;若前者可以跑,后者却不能跑,说明此子结构仅属于前者,好像问题就解决了?
  3. 但仔细一想,长度为 2000 2000 2000的串子序列似乎太多了,好像不能跑完?这里我们考虑 b f s bfs bfs,记录哪些状态(二维)已经遍历;对于已经遍历过的状态,虽然此前在遍历时当前状态所代表的子结构可能不一样(比如序列自动机通过不同的路径到达某个节点),但此后节点的可到达性却只与当前节点是否可到达有关,而与怎样到达的无关,故后续节点是否可到达在之前的 b f s bfs bfs中已经处理好了;因此可以像普通的 b f s bfs bfs一样,遍历过的状态可接忽略掉!(使用 n × n n×n n×n v i s vis vis数组记录)
  4. 复杂度:后缀自动机为 O ( n ∗ ∑ ) O(n*∑) O(n);序列自动机为 O ( n ∗ ∑ ) O(n*∑) O(n);每个后缀自动机节点数为 2 ∗ n 2*n 2n,每个序列自动机节点数为 n n n b f s bfs bfs遍历时每个点遍历边数为 ∑ ∑ ,因此 b f s bfs bfs复杂度为 O ( n ∗ ∑ ) O(n*∑) O(n
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值