1. 程式人生 > >【BZOJ1152】歌唱王國(生成函數,KMP)

【BZOJ1152】歌唱王國(生成函數,KMP)

導致 字符 com max 直接 std ++i problem 生成

【BZOJ1152】歌唱王國(生成函數,KMP)

題面

BZOJ
洛谷

題解

根據\(YMD\)論文來的QwQ。
首先大家都知道普通型生成函數是\(\displaystyle \sum_{i=0}^{\infty}a_ix^i\),類似的定義概率生成函數\(\displaystyle F(x)=\sum_{i=0}^\infty P(X=i)x^i\)。其中\(P(X=i)\)表示\(X\)這個隨機變量為\(i\)的概率。
那麽我們可以知道幾個結論:\(\displaystyle F(1)=\sum_{i=0}^\infty P(X=i)=1\),這個結論很顯然。
如果我們要求解期望,顯然期望等於\(\displaystyle \sum_{i=0}^{\infty}iP(X=i)\)


我們發現\(\displaystyle F'(x)=\sum_{i=1}^\infty iP(X=i)x^{i-1}\),那麽我們要求解的期望就是\(F'(1)\)
回到題目。
我們設\(f_i\)表示終止長度為\(i\)的概率,\(F(x)\)為其概率生成函數,那麽要求解的就是\(F'(1)\)
\(g_i\)表示當前長度為\(i\)且還未結束的概率,\(G(x)\)為其普通型生成函數,那麽我們可以得到:
\[F(x)+G(x)=1+G(x)x\]
這個式子什麽意思呢?首先右側的\(1+G(x)x\)表示在當前序列後面隨機加上一個字符,要加一的願意是\(g_0=1\)
。那麽隨機加完一個字符後,結束的概率是變成了\(F(x)\),未結束的概率是\(G(x)\),所以得到了這個等式。
\(a_i\)表示\(A[1..i]\)是否是串\(A\)\(border\),那麽我們可以得到:
\[G(x)(\frac{1}{m})^Lx^L=\sum_{i=1}^{L}a_iF(x)(\frac{1}{m})^{L-i}x^{L-i}\]
等式左側的含義是在當前未結束的串的後面直接接上目標串,那麽這樣一定會結束。
右側的含義是因為前面的隨機串中可能已經匹配了一部分的長度,導致在匹配了一半此時就已經結束了。
那麽我們插入了一半就結束了,並且此時我們插入的一定是一段前綴,因此只有可能當這個位置是\(border\)
時才可能結束。
那麽強制在這個\(border\)時會結束,等價於我們欽定了隨機串的最後\(L-i\)位。那麽就得到了右邊的式子。
我們要求解的東西是\(F'(1)\)
首先第一個式子可以寫成:
\[F'(x)+G'(x)=G(x)+G'(x)x\]
化簡得到\(F'(1)=G(1)\)
然後令\(x=1\)帶入到第二個式子中,可以得到:
\[G(1)=\sum_{i=1}^La_im^i\]
那麽只需要\(KMP\)求解\(border\)就行了。

#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 10000
#define MAX 100100
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
int n,T,pw[MAX],s[MAX],nt[MAX];
int main()
{
    n=read();T=read();
    pw[0]=1;for(int i=1;i<MAX;++i)pw[i]=1ll*pw[i-1]*n%MOD;
    while(T--)
    {
        int m=read(),ans=0;
        for(int i=1;i<=m;++i)s[i]=read();
        for(int i=2;i<=m;++i)
        {
            int t=nt[i-1];
            while(t&&s[t+1]!=s[i])t=nt[t];
            if(s[t+1]==s[i])++t;
            nt[i]=t;
        }
        for(int i=m;i;i=nt[i])ans=(ans+pw[i])%MOD;
        printf("%04d\n",ans);
    }
    return 0;
}

【BZOJ1152】歌唱王國(生成函數,KMP)