子序列自动机的每个状态表示当前位置结尾的字符串中第一次出现的字符串。状态数 (n+1) ,转移数 (O(n imes sum)),其中 (n) 为字符串长度,(sum) 为字符集大小。
应用
-
判断一个字符串是否是另一个字符串的子序列
对第二个序列建立子序列自动机,拿第一个串在上面跑,如果顺利跑完就说明是子序列。
-
求一个字符串的本质不同子序列个数
建立子序列自动机,我们发现任何一个子序列在自动机上跑,最后停下的位置一定是它第一次出现的位置,并且子序列自动机上的每条路径是且仅是这个字符串的一个子序列。所以答案就是这个自动机上从初始节点开始的路径个数。在 DAG 上拓扑排序+DP即可。