【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)的更多相关文章

  1. 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差

    [题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...

  2. [CTSC2006]歌唱王国

    [CTSC2006]歌唱王国 Tags:题解 题意 链接:在空串后不断随机添加字符,直到出现串\(S_i\)为止.求最终串的期望长度.\(\sum |S_i|\le 5*10^6\) 题解 以下内容来 ...

  3. bzoi1152 [CTSC2006]歌唱王国Singleland

    [CTSC2006]歌唱王国Singleland Time Limit: 30 Sec Memory Limit: 162 MB Description 在歌唱王国,所有人的名字都是一个非空的仅包含整 ...

  4. P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】

    正题 题目链接:https://www.luogu.com.cn/problem/P4548 题目大意 \(t\)次询问,给出一个长度为\(m\)的串\(S\)和一个空串\(T\),每次在\(T\)后 ...

  5. 洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)

    题面 传送门 给定一个长度为\(L\)的序列\(A\).然后每次掷一个标有\(1\)到\(m\)的公平骰子并将其上的数字加入到初始为空的序列\(B\)的末尾,如果序列B中已经出现了给定序列\(A\), ...

  6. Luogu4548 CTSC2006 歌唱王国 概率生成函数、哈希

    传送门 orz ymd 考虑构造生成函数:设\(F(x) = \sum\limits_{i=0}^\infty f_ix^i\),其中\(f_i\)表示答案为\(i\)的概率:又设\(G(x) = \ ...

  7. 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)

    洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...

  8. luogu P4548 [CTSC2006]歌唱王国

    传送门 这题\(\mathrm{YMD}\)去年就讲了,然而我今年才做(捂脸) 考虑生成函数,设\(f_i\)表示最终串长为\(i\)的概率,其概率生成函数为\(F(x)=\sum f_ix^i\), ...

  9. BZOJ 1152 歌唱王国

    题目传送门 分析: 这道题很神仙,我们给出低配版解法和高配版解法2333 低配版: 首先知道这样一个公式...(证明去高配版) 当一个字符串S其中S [ 1 , i ] = S [ n - i + 1 ...

随机推荐

  1. MyBatis模糊查询不报错但查不出数据的一种解决方案

    今天在用MyBatis写一个模糊查询的时候,程序没有报错,但查不出来数据,随即做了一个测试,部分代码如下: @Test public void findByNameTest() throws IOEx ...

  2. Python_生产者消费者模型、管道、数据共享、进程池

    1.生产者消费者模型 生产者 —— 生产数据的人 消费者 —— 消费数据的人 生产者消费者模型:供销数据不平衡的现象. import time import random from multiproc ...

  3. CRM系统(第二部分)

      阅读目录 一.讲师与学生简介 二. 初始化 ,studyrecord, 三.初始化 course_record:批量生成学习记录 四. 考勤  url跳转 五.录入成绩 六.highcharts表 ...

  4. 百度地图支持https

    百度地图SDK,  支持https <script src="http://api.map.baidu.com/api?v=3.0&ak=nbnttGGI6lilllgy2zn ...

  5. 【问题解决方案】Dev C++ 无法调试的问题与解决

    听翁恺老师课的时候用到一个叫DevC++的编辑器. 学到调试部分的时候,老师的没问题我的报错.我?? 试一试网上查到的方法: 工具 --> 编译选项 --> 代码生成/优化 --> ...

  6. jenkins 迁移后 提示 反向代理设置有误

    jenkins报:反向代理设置有误-布布扣-bubuko.comhttp://www.bubuko.com/infodetail-2038758.html [Linux][Jenkins]系统配置报反 ...

  7. md5加密通过URL传给后台

    首先要把你要用的md5库引入 这个技术其实挺简单的,咋们直接贴上代码(这个是项目上的) sign = hex_md5("type="+type&"userId=& ...

  8. YOLO.h5 下载

    链接:https://pan.baidu.com/s/1sTxkuaFWXqT4yXLHQ9BgUA 密码:ga0o fhwayd_w1231234asd><321$%

  9. IdentityServer4【Introduction】之术语

    术语 在规范.文档和对象模型中使用了一些你应该了解的术语. IdentityServer IdentityServer是一个OpenID Connect的提供者,它实现了OpenID Connect和 ...

  10. eclipse中添加tomcat

    https://blog.csdn.net/Forlogen/article/details/54090335(copy) 为了Java Web的开发,下面我们来安装一下Tomcat服务器,并将其配置 ...