王国を歌っLuogu4548

王国を歌っLuogu4548

質問表面:Luogu

解決

それは興味深いトピックです。

離散ランダム変数整数を関数を生成するクラス\(T \) 関数の各項目\(X ^ iは\)係数は、変数の値を表し、(Iは\)\また、確率これは、次のとおりです。

\ [F(X)= \ sum_ {i = 0} ^ {\ inftyの} P(T = I)は、x ^ I \]

この関数は、次のような興味深い特性、多数有している\(= \ 1をF(1))
とのために、\(T \)有することが望ましい:\(E(T)= F「(1)\)。

この質問は作ることになりました\(N- \)アルファベットサイズを表し、\(m個\)は、名前の長さを表しています。

設定考える\(F(X)\)の歌のためにあることを意味\(Iは\)確率生成機能を終了数、\(G(Xは)\)の歌のためのことを意味する\(Iは\)数字ありません関数を生成する確率の終わり。

明らかに、以下の式があります:

\ [XG(X)+ 1 = F(X)+ G(X)\]

これは、文字列の終わりではありませんし、その後の文字に接続され、それが終了したり、終了しない場合があります。

第二に、あります。

\ [G(X)\ビッグ(\ FRAC {1} {n}はX \ビッグ)^ M = \ sum_ {i = 1} ^ {M} A_ {I} F(X)\ビッグ(\ FRAC {1 } {n}はX \ビッグ)^ {MI} \]

それは終わらない名前の文字列の末尾の後に接続され、それは予め、前に終了してもよい\は(A_ {I} = 0/1 \)は、を表し(〔iは、1]の\を \) かどうか文字列\(S \)\(ボーダー\)

式及び簡略化の一次導関数があります。

\ [F '(x)=(x-1)G'(x)+ G(X)\]

第2の式で\(X = 1 \)です。

\ [G(1)= \ sum_ {i = 1} ^ {M} A_ {I} N ^ {I} \]

そう:

\ [E(X)= F '(1)= G(1)= \ sum_ {i = 1} ^ m個のA_ {I} N ^ {I} \]

以下のための\(A_ {I} \)、\ (KMP \)しようとします。

コード


#include<cstdio>
#define N 100005

using namespace std;

inline int In(){
    char c=getchar(); int x=0,ft=1;
    for(;c<'0'||c>'9';c=getchar()) if(c=='-') ft=-1;
    for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
    return x*ft;
}

const int P=10000;
int n,T,m,s[N],nex[N],pw[N];

int main(){
    n=In(); T=In();
    while(T--){
        m=In(); for(int i=1;i<=m;++i) s[i]=In();
        pw[0]=1; for(int i=1;i<=m;++i) pw[i]=pw[i-1]*n%P;
        for(int i=2,j=0;i<=m;++i){
            while(j&&s[j+1]!=s[i]) j=nex[j];
            if(s[j+1]==s[i]) ++j; nex[i]=j;
        }
        int sum=0;
        for(int i=m;i;i=nex[i]) sum=(sum+pw[i])%P;
        printf("%.4d\n",sum);
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/pkh68/p/11404703.html