COCI20162017 Contest 7 F
COCI20162017 Contest#7 F
前置知识
沿用上面的定义,设字符串$S$的$\text{border}$集合为$B(S)$
考虑对于单串$S$求答案,设答案为$Ans$
将所有可能出现的字符串分为两个集合$A,B$
其中$A$为所有恰好出现$S$的字符串集合,$B$为所有还未出现匹配的字符串集合
我们知道每个字符串出现有一定的概率,即为$\frac{1} {n^{|T|} }$
设$A$集合中所有长度为$i$的串出现的概率总和为$A_i$,同理得到$B_i$
$A$中的概率是不重复的,因为每个匹配过程只有一次会恰好匹配,因此可以得到 $\sum A_i=1$
(而$B$中每个不匹配的串概率会被算多次)
最后的答案期望可以表示为
1.每个匹配的串概率*匹配时串的长度之和,即$Ans=\sum_i i\cdot A_i$
2.将匹配成功的长度,转化为匹配失败的次数之和(包含空串),可以表示为$Ans=\sum B_i$
直接计算似乎比较麻烦
考虑如果在$B$中所有字符串的后面接上一个原串$S$(同时概率乘上$\frac{1} {n^{|S|} }$),那么得到的新字符串一定完成匹配
但是实际上,这样的串并不一定完全合法,因为可能在更早的位置出现匹配
由上面的定义,假设原先在$B$中的串为$T$,原先已经在$S$中匹配了$T’$作为前缀
那么直接强行加上$S$后,如果$T’$会影响第一个出现匹配位置,设出现匹配时加入的字符串为$R$
则显然满足: $R$即是$S$的一段前缀,又是$S$的一段后缀,也就是$R\in B(S)$
而剩下部分($|S|-|R|$),实际上是无效的,因此概率会被算小了
不妨设$B$集合接上一个$S$串得到的集合为$C$
可以把$C$中的字符串,按照多余的部分$|S|-|R|$为多个部分$D_{R}$其中$R\in B(S)$
发现,实际上去掉多余的部分后,每个$D_R$集合就与$A$集合对应,但是多余部分的要乘回去
即 $A_i=D_{|R|,i+|S|-|R|}\cdot n^{|S|-|R|}$ (偏移多出的部分)
由$B,C$的关系,有$\sum_R D_{R,i}=C_i=B_i\cdot \frac{1} {n^{|S|} }$
也就是$B_i\frac{1} {n^{|S|} }=\sum _R D_{R,i+|S|-|R|}=\sum _R \frac{A_{i+|S|-|R|} } {n^{|S|-|R|} }$
即 $B_i=\sum _R A_{i+|S|-|R|}n^{|R|}$
将上式求和对于$i$求和,得到$\sum B_i=\sum_i\sum_R A_{i+|S|-|R|}n^{|R|}$
由于$\sum A_i=1$ ($\sum A_i$和$\sum A_{i+|S|-|R|}$等价), 即
$Ans=\sum B_i=\sum_{R\in B(S)} n^{|R|}$