[[HDU-6791] 2020HDU多校第三场T1](http://acm.hdu.edu.cn/showproblem.php?pid=6791)(回文自动机)
#[HDU-6791] 2020HDU多校第三场T1(回文自动机)
前置知识:
2.回文自动机
3.回文串与 \(\text{Border}\)
3.1:回文串的 \(\text{Border}\) 也是回文串
若有回文串 \(S\) 的一个 \(\text{Border} :T\) ,则 \(S_{1,|T|}=S_{|S|-|T|+1,|S|}=reverse(S_{1,|T|})\)
故 \(T\) 也是一个回文串
3.2:遍历回文自动机的 \(fail\) 链,能得到当前串的所有 \(\text{Border}\) (基于3.1得到)
约定:串 \(S\) 的 \(\text{Border}\) 集合为 \(B(S)\) ,字符集为 \(\Sigma\)
题意:
设随机空串末尾添加 \(\Sigma\) 中的字符,第一次出现子串 \(S\) 的期望长度为 \(E(S)\)
给定一个串,每次查询它的两个回文子串 \(A,B\) ,比较 \(E(A),E(B)\)
起源?
一切的起源都是" 国家集训队论文2018 :1-浅谈生成函数在掷骰子问题上的应用 "的一个结论。。。
还有为什么会是回文子串呢?因为只有回文自动机能访问子串的所有 \(\text{Border}\) 。。。
结论 以及 口胡证明?
\(\begin{aligned}E(S)=\sum_{T\in
B(S)}|\Sigma|^{|T|}\end{aligned}\) (???)
在原论文给出了生成函数性的证明,实际可以直接口胡(好吧也差不多),大致分成两个步骤
- \(E(S)=\sum_{i=0}^{\infty}\) 长度为 \(i\) 依然不包含 \(S\) 的概率(即把长度为 \(i\) 时恰好合法转化为了 \(0..i-1\) 时不合法)
2.设所有长度下不合法的串集合为 \(G\) (每个不合法串有概率 \(G(T)\) ),合法的串集合为 \(F\) (每个合法串也有概率 \(F(T)\) )
由第一步 \(E(S)=\sum G(T)\) ,合法串的概率不会重复,所以 \(\sum F(T)=1\)
考虑 \(G\) 中所有的串,如果在后面接上 \(S\) 必然合法,但是可能在更早的时候就结束了,这是必然满足接上的前缀是 \(\text{Border}\)
也就是说,在 \(G\) 集合后面接上 \(S\) 后,不仅会得到 \(F\) 集合,还会得到 \(F\) 集合后面额外接上 \(|S|-|R|,(R\in B(S))\) 长度字符的状态
所以有 \(\sum G(T)\cdot (\frac{1}{|\Sigma|})^{|S|}=\sum_{R\in B(S)}\sum F(T)\cdot (\frac{1}{|\Sigma|})^{|S|-|R|}\)
化简且带入 \(\sum F(T)=1\) ,得到 \(E(S)=\sum G(T)=\begin{aligned}\sum_{R\in B(S)}|\Sigma|^{|R|}\end{aligned}\)
那么比较问题就落到了比较 \(\text{Border}\) 上面
视答案为为一个 \(26\) 进制数从高位到低位比较,转化为直接从大到小比较 \(\text{Border}\) 序列的字典序即可
建出回文自动机后,倍增找到当前查询串对应的状态,所有的 \(\text{Border}\) 就是 \(fail\) 链上所有非空状态长度
比较字典序可以
1.倍增+hash
2.可以根据 \(\text{Border}\) 的性质分解为等差数列后暴力比较
3.像后缀数组一样,倍增地去为所有节点的字典序排序,这样查询是 \(O(1)\) 的
hash应该细节比较少,但是常数大
以下是hash版本
1 |
|