构建
口胡一下过程:
-
\(fail\) 边指向自己的最长回文后缀(偶根指向奇根)。
-
定理:每添加一个字符,至多新增一个新的本质不同的回文串,且是所有 回后缀中最长的。
由此得出推论:本质不同的回文子串(回文自动机的点数)不超过 |S|
-
暴力跳终止链,找到第一个左侧有 \(x\) 的回文后缀 \(v\)。
维护转移边,若 \(v\) 已经有 \(x\) 出边,找到该节点 \(d\),本次终止链末尾即为 \(d\)。否则,新建一个点 \(u\),且 \(len_u=len_v+2\)。
维护 \(fail\) 边,找到下一个旧的回文后缀 \(v'\) 满足左边有一个 \(x\),此时必有 \(x\) 出边,找到该节点 \(u'\),则 \(fail_u=u'\)。
-
时间复杂度均摊 \(\mathcal{O}(n)\)。