
本文共 4907 字,大约阅读时间需要 16 分钟。
题目
思路
感谢提供了思路。我不生产思考,我只是智慧结晶的搬运工。
首先,按照一般的做法,设 f x f_x fx 表示长度为 x x x 时成功匹配的概率; g x g_x gx 表示长度为 x x x 时没有成功匹配(长度超过 x x x 时完成匹配)的概率。然后就发现做不动了。
怎么办呢?使用船新操作:概率生成函数!名字听着玄乎,其实不好用,而且难点不在这上面。
我们将 F ( x ) = ∑ i = 0 + ∞ E i x i F(x)=\sum_{i=0}^{+\infty}E_ix^i F(x)=∑i=0+∞Eixi 称为概率生成函数。其中 E i E_i Ei 表示检测值为 i i i 的概率。
将 x = 1 x=1 x=1 代入,得到 F ( 1 ) = ∑ i = 0 + ∞ E i = 1 F(1)=\sum_{i=0}^{+\infty}E_i=1 F(1)=∑i=0+∞Ei=1 (万川东到海,概率和为一)。
对 F F F 求导,得到 F ′ ( x ) = ∑ i = 1 + ∞ i E i x i − 1 F'(x)=\sum_{i=1}^{+\infty}iE_{i}x^{i-1} F′(x)=∑i=1+∞iEixi−1 ;于是将 x = 1 x=1 x=1 代入,得到 F ′ ( 1 ) = ∑ i = 1 + ∞ i E i = e F'(1)=\sum_{i=1}^{+\infty}iE_i=e F′(1)=∑i=1+∞iEi=e (即原本要求的期望值)。
说了这么多,我们回到这道题,考虑这两个生成函数:
- f f f 的生成函数 F ( x ) = ∑ i = 0 + ∞ f i x i F(x)=\sum_{i=0}^{+\infty}f_i x^i F(x)=∑i=0+∞fixi
- g g g 的生成函数 G ( x ) = ∑ i = 0 + ∞ g i x i G(x)=\sum_{i=0}^{+\infty}g_i x^i G(x)=∑i=0+∞gixi
我们要找他们之间的关系,可以找 f f f 和 g g g 之间的关系。
关系一
g i = f i + 1 + g i + 1 g_i=f_{i+1}+g_{i+1} gi=fi+1+gi+1
这是当然咯,长度为 i i i 时没有匹配,那就是长度为 i + 1 i+1 i+1 时匹配,或者比 i + 1 i+1 i+1 更长的时候匹配。
我们试着用生成函数的形式写出来:
F ( x ) = f 0 + f 1 x + f 2 x 2 + ⋯ + f n x n + ⋯ G ( x ) = g 0 + g 1 x + g 2 x 2 + ⋯ + g n x n + ⋯ x G ( x ) = g 0 x + g 1 x 2 + ⋯ + g n − 1 x n + ⋯ \begin{aligned} F(x)&=f_0+f_1x+f_2x^2+\cdots+f_nx^n+\cdots\\ G(x)&=g_0+g_1x+g_2x^2+\cdots+g_nx^n+\cdots\\ xG(x)&=\qquad g_0x+g_1x^2+\cdots+g_{n-1}x^n+\cdots \end{aligned} F(x)G(x)xG(x)=f0+f1x+f2x2+⋯+fnxn+⋯=g0+g1x+g2x2+⋯+gnxn+⋯=g0x+g1x2+⋯+gn−1xn+⋯
加之 f 0 = 0 , g 0 = 1 f_0=0,g_0=1 f0=0,g0=1 ,显然, x G ( x ) = F ( x ) + G ( x ) − 1 (1) xG(x)=F(x)+G(x)-1\tag{1} xG(x)=F(x)+G(x)−1(1)
尽管 ( 1 ) (1) (1) 式目前没有什么用,等会儿我们会看到它的功力。虽然那个结论不用生成函数也能证。
关系二(不易发现)
用 L L L 表示原字符串的长度, m m m 表示字符集(生成时是每次在 [ 1 , m ] [1,m] [1,m] 中随机一个整数)大小,则
( 1 m ) L ⋅ g x = ∑ i = 1 L a i ( 1 m ) L − i ⋅ f x + i \left(\frac{1}{m}\right)^L\cdot g_x = \sum_{i=1}^{L}a_i\left(\frac{1}{m}\right)^{L-i}\cdot f_{x+i} (m1)L⋅gx=i=1∑Lai(m1)L−i⋅fx+i
a i a_i ai 表示,原字符串的前 i i i 位和后 i i i 位是否相同。相同为 1 1 1 ,否则为 0 0 0 。即,原字符串是否有一个长度为 i i i 的 b o r d e r \rm border border 。为啥有这个式子成立呢?
首先, f f f 表示的已经匹配的字符串,一定是 以原字符串结尾。也就是说,最后 L L L 个字符一定就是原字符串。而且,去掉最后一个字符,一定没有完成匹配。
看右边的式子。 a i = 1 a_i=1 ai=1 时才会累加,这就代表着原字符串前 i i i 个字符与后 i i i 个字符相同。而 f i + x f_{i+x} fi+x 就是以原字符串结尾的。所以 f i + x f_{i+x} fi+x 的后 i i i 位,恰好就是原字符串的后 i i i 位,与原字符串的前 i i i 位相同。此时,在末尾接上一截剩下的 L − i L-i L−i 位,最后 L L L 位就恰好匹配了。 I n o t h e r w o r d s \rm In\;other\;words Inotherwords ,我们完成了一个长度为 x + L x+L x+L 的匹配于尾端,但是只能保证前 x x x 位没有匹配。
对于左式,很简单,对于一个长度为 x x x 的、尚未完成匹配的字符串,我在后面暴力接入了一个原字符串。两式都代表一个长度为 x + L x+L x+L 的已经匹配的字符串,故相等。
其实,右式就是在枚举:将原字符串的前 i i i 位接到最后,就已经完成了匹配。
我们再用生成函数的方法写出来:
( x m ) L G ( x ) = ∑ i = 0 + ∞ ( 1 m ) L g i x i + L F ( x ) ∑ i = 1 L a i ( x m ) L − i = ∑ i = 0 + ∞ x i + L ∑ j = 1 L a j ( 1 m ) L − j f i + j \begin{aligned} \left(\frac{x}{m}\right)^L G(x)&=\sum_{i=0}^{+\infty}\left(\frac{1}{m}\right)^Lg_ix^{i+L}\\ F(x)\sum_{i=1}^{L}a_i\left(\frac{x}{m}\right)^{L-i}&=\sum_{i=0}^{+\infty}x^{i+L}\sum_{j=1}^{L}a_j\left(\frac{1}{m}\right)^{L-j}f_{i+j} \end{aligned} (mx)LG(x)F(x)i=1∑Lai(mx)L−i=i=0∑+∞(m1)Lgixi+L=i=0∑+∞xi+Lj=1∑Laj(m1)L−jfi+j
你可能会问,下面那个等式是怎么搞出来的?可以考虑 x i + L x^{i+L} xi+L 的系数由什么组成。假设左式的求和中的 a j ( x m ) L − j a_j(\frac{x}{m})^{L-j} aj(mx)L−j 为之提供了贡献,由于其次数是 L − j L-j L−j ,所以原本 F ( x ) F(x) F(x) 中是 x i + j x^{i+j} xi+j 这一项与之相乘。故 F ( x ) F(x) F(x) 的系数是 f i + j f_{i+j} fi+j ,求和中的系数是 a j ( 1 m ) L − j a_j(\frac{1}{m})^{L-j} aj(m1)L−j ,相乘即可。
仔细观察,得到结论: ( x m ) L G ( x ) = F ( x ) ∑ i = 1 L a i ( x m ) L − i (2) \left(\frac{x}{m}\right)^LG(x)=F(x)\sum_{i=1}^L a_i\left(\frac{x}{m}\right)^{L-i}\tag{2} (mx)LG(x)=F(x)i=1∑Lai(mx)L−i(2)
嗯,好像差不多,该进行体力工作了:暴力解!
对 ( 1 ) (1) (1) 式两边求导,有 x G ′ ( x ) + G ( x ) = F ′ ( x ) + G ′ ( x ) xG'(x)+G(x)=F'(x)+G'(x) xG′(x)+G(x)=F′(x)+G′(x)
导数基本姿势 [ f ( x ) g ( x ) ] ′ = f ′ ( x ) g ( x ) + f ( x ) g ′ ( x ) [f(x)g(x)]'=f'(x)g(x)+f(x)g'(x) [f(x)g(x)]′=f′(x)g(x)+f(x)g′(x) 应该是人尽皆知的吧?
然后你可以移项,得到 F ′ ( x ) = ( x − 1 ) G ′ ( x ) + G ( x ) F'(x)=(x-1)G'(x)+G(x) F′(x)=(x−1)G′(x)+G(x)
F ′ ( x ) F'(x) F′(x) 鸟用没有,我们想知道的是什么?在 x = 1 x=1 x=1 处的取值。答案就是 F ′ ( 1 ) F'(1) F′(1) 嘛。我们试试:
F ′ ( 1 ) = ( 1 − 1 ) G ′ ( 1 ) + G ( 1 ) = G ( 1 ) F'(1)=(1-1)G'(1)+G(1)=G(1) F′(1)=(1−1)G′(1)+G(1)=G(1)
这告诉我们, G ( 1 ) G(1) G(1) 就是答案!虽然这个结论不用生成函数也挺显然的。
( 2 ) (2) (2) 式还没有使用呢。我们拿出来,发现 G ( x ) G(x) G(x) 也鸟用没有——我们需要 G ( 1 ) G(1) G(1) 。我们再试一次:
( 1 m ) L G ( 1 ) = F ( 1 ) ∑ i = 1 L a i ( 1 m ) L − i \left(\frac{1}{m}\right)^LG(1)=F(1)\sum_{i=1}^{L}a_i\left(\frac{1}{m}\right)^{L-i} (m1)LG(1)=F(1)i=1∑Lai(m1)L−i
哦,对了,我一来就说了, F ( 1 ) = 1 F(1)=1 F(1)=1 恒成立。代入如何?
G ( 1 ) = ∑ i = 1 L a i × m i G(1)=\sum_{i=1}^{L}a_i\times m^i G(1)=i=1∑Lai×mi
任务完成。 a i a_i ai 这种东西,哈希呗!(虽然 k m p \tt kmp kmp 可能更好打。)
代码
看了看题解,并不长的样子。然而我还是不想打了。
实在想要代码,去题解区搞一份噻!
后记
K n o w N a m e B l o g e r \sf KnowNameBloger KnowNameBloger 在另一道类似的题目中,试图在后方加入一个长度为 n − 1 n-1 n−1 的串,然而总是差一项。我也百思不得其解。进行了充分的思考之后,我意识到:加上长度为 n − 1 n-1 n−1 的串对 g 0 g_0 g0 不适用。所以那种方法求出来的值会小 1 1 1 。
发表评论
最新留言
关于作者
