Luogu P4548 [CTSC2006]歌唱王国

Link
\(a_i=[\text{i is a border}]\)
\(f_i\)为结束时序列长度为\(i\)的概率,其PGF为\(F(x)\)
\(g_i\)为序列长度达到\(i\)且尚未结束的概率,其OGF为\(G(x)\)
分析得到:

\[\begin{aligned} F(x)+G(x)&=1+xG(x)\\ (\frac xn)^LG(x)&=\sum\limits_{i=1}^La_iF(x)(\frac xn)^{L-i} \end{aligned} \]

推导后得到\(ans=F'(1)=\sum\limits_{i=1}^La_in^i\)

#include<cctype>
#include<cstdio>
const int N=100007,P=10000;
char ibuf[1<<25|1],*iS=ibuf;int pw[N],s[N],next[N];
int read(){int x=0;while(isspace(*iS))++iS;while(isdigit(*iS))(x*=10)+=*iS++&15;return x;}
int main()
{
    fread(ibuf,1,1<<25,stdin);
    int n=read(),t=read();
    for(int i=pw[0]=1;i<=100000;++i) pw[i]=pw[i-1]*n%P;
	while(t--)
    {
	int m=read(),ans=0;
	for(int i=1;i<=m;++i) s[i]=read();
	for(int i=2,k;i<=m;next[i]=s[k+1]==s[i]? ++k:k,++i) for(k=next[i-1];k&&s[k+1]^s[i];k=next[k]);
	for(int i=m;i;i=next[i]) ans+=pw[i]-P,ans+=ans>>31&P;
	printf("%04d\n",ans);
    }
}
posted @ 2020-05-06 16:17  Shiina_Mashiro  阅读(109)  评论(0编辑  收藏  举报