[[HDU-6791] 2020HDU多校第三场T1](回文自动机)
[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}$~~(???)~~ 在原论文给出了生成函数性的证明,实际可以直接口胡(好吧也差不多),大致分成两个步骤 1.$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 |
|