欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[51nod 1444]打字的猴子

程序员文章站 2024-03-21 11:13:34
...

一、题目

[51nod 1444]打字的猴子

二、解法

考虑dpdp,设E[i]E[i]为已经成功匹配到了ii,想要匹配到nn的期望,那么答案就是E[0]E[0],考虑多匹配一个字符后的影响,我们用transtrans来描述它,转移如下:
E[x]=1ki=1kE[trans[x][i]]+1E[x]=\frac{1}{k}\sum_{i=1}^k E[trans[x][i]]+1由于transtrans并不是一定比xx小,需要高斯消元,时间复杂度O(n3)O(n^3)


考虑优化,考虑transtrans的性质,很重要的一点是xxfail[x]fail[x]transtrans除了s[x+1]s[x+1]这一项(可以匹配),其它的值都是一模一样的,我们可以据此列出恒等式:
E[x]E[fail[x]]=E[trans[x][s[x+1]]]×1kE[trans[fail[x]][s[x+1]]×1kE[x]-E[fail[x]]=E[trans[x][s[x+1]]]\times\frac{1}{k}-E[trans[fail[x]][s[x+1]]\times\frac{1}{k}E[x]E[fail[x]]=E[x+1]×1kE[fail[x+1]]×1kE[x]-E[fail[x]]=E[x+1]\times\frac{1}{k}-E[fail[x+1]]\times\frac{1}{k}我们设G(x)=E(x)E(fail[x])G(x)=E(x)-E(fail[x]),那么上式可以化简成:
G(x)=G(x+1)×1kG(x)=G(x+1)\times \frac{1}{k}GG其实是有边界的,G(1)=E(1)E(0)=kG(1)=E(1)-E(0)=-k,那么G(x)=kxG(x)=-k^x,于是G(n)=E(n)E(fail(n))=knG(n)=E(n)-E(fail(n))=-k^n,由于E(n)=0E(n)=0,所以E(fail[n])=knE(fail[n])=k^nE(fail[fail[n]])=kn+kfail[n]E(fail[fail[n]])=k^n+k^{fail[n]},以此类推即可得到答案E(0)E(0)

咕咕咕