...
一、题目
二、解法
考虑dp,设E[i]为已经成功匹配到了i,想要匹配到n的期望,那么答案就是E[0],考虑多匹配一个字符后的影响,我们用trans来描述它,转移如下:
E[x]=k1i=1∑kE[trans[x][i]]+1由于trans并不是一定比x小,需要高斯消元,时间复杂度O(n3)。
考虑优化,考虑trans的性质,很重要的一点是x和fail[x]的trans除了s[x+1]这一项(可以匹配),其它的值都是一模一样的,我们可以据此列出恒等式:
E[x]−E[fail[x]]=E[trans[x][s[x+1]]]×k1−E[trans[fail[x]][s[x+1]]×k1E[x]−E[fail[x]]=E[x+1]×k1−E[fail[x+1]]×k1我们设G(x)=E(x)−E(fail[x]),那么上式可以化简成:
G(x)=G(x+1)×k1G其实是有边界的,G(1)=E(1)−E(0)=−k,那么G(x)=−kx,于是G(n)=E(n)−E(fail(n))=−kn,由于E(n)=0,所以E(fail[n])=kn,E(fail[fail[n]])=kn+kfail[n],以此类推即可得到答案E(0)。
咕咕咕