[CTSC2006]歌唱王国

题目

传送门 to luogu

思路

感谢@xyz32768 的博客提供了思路。我不生产思考,我只是智慧结晶的搬运工。

首先,按照一般的做法,设 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 g_x = \sum_{i=1}^{L}a_i\left(\frac{1}{m}\right)^{L-i}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 Border \text{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 位就恰好匹配了。

对于左式,很简单,对于一个长度为 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。代入如何(顺便把 m − L m^{-L} mL 移项)?

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 KMP KMP 党勿喷)。

代码

看了看题解,并不长的样子。然而我还是不想打了。

实在想要代码,去题解区搞一份噻!

你可能感兴趣的:(字符串,数学,推理)