[CTSC2006]歌唱王国
发布日期:2021-05-07 01:01:18 浏览次数:25 分类:原创文章

本文共 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+iEixi1 ;于是将 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++gn1xn+

加之 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)Lgx=i=1Lai(m1)Lifx+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 Li 位,最后 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=1Lai(mx)Li=i=0+(m1)Lgixi+L=i=0+xi+Lj=1Laj(m1)Ljfi+j

你可能会问,下面那个等式是怎么搞出来的?可以考虑 x i + L x^{i+L} xi+L 的系数由什么组成。假设左式的求和中的 a j ( x m ) L − j a_j(\frac{x}{m})^{L-j} aj(mx)Lj 为之提供了贡献,由于其次数是 L − j L-j Lj ,所以原本 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)Lj ,相乘即可。

仔细观察,得到结论: ( 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=1Lai(mx)Li(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)=(x1)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)=(11)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=1Lai(m1)Li

哦,对了,我一来就说了, 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=1Lai×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 n1 的串,然而总是差一项。我也百思不得其解。进行了充分的思考之后,我意识到:加上长度为 n − 1 n-1 n1 的串对 g 0 g_0 g0 不适用。所以那种方法求出来的值会小 1 1 1

上一篇:JavaScript实现文本框和密码框placeholder效果(兼容ie8)
下一篇:React中设置404页面

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月24日 22时29分04秒