首先题目中「本质不同」指的是表示方式本质不同,即每个用来拼接的子串分别本质不同,但 t 并不一定要本质不同。
n=1 时,显然在 SAM 上把每个状态包含的子串数量求和即可。
当然,也可以在 DAG 上 DP。
n>1 时,广义 SAM 貌似搞不来这种东西。
考虑照样在 DAG 上 DP。那么我们需要的 DAG 要类似一个分层图的形式,若在本层失配则连向之后最近的一个能匹配的结点。
这个东西与序列自动机十分类似。实际上,表示方式就可以看做某种子序列的定义。
考虑建出 n 个 SAM,对于第 i 个 SAM 上的状态 u,若不存在字符 c 的出边,就寻找 i 之后的 SAM 中第一个有 c 出边的根,从 u 连一条出边到那个根的出边指向的状态。
这样子,我们便能判定一个 t 是否能被接受,或者说构造出一个能够按题目中方式接受字符串的自动机了。
并且,每条从第 1 个 SAM 的根出发的路径,恰对应一种本质不同的表示方式。
代码:
1 |
|