【BZOJ1152】歌唱王国(生成函数,KMP)
【BZOJ1152】歌唱王国(生成函数,KMP)
题面
题解
根据\(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)\)为其普通型生成函数,那么我们可以得到:
\]
这个式子什么意思呢?首先右侧的\(1+G(x)x\)表示在当前序列后面随机加上一个字符,要加一的愿意是\(g_0=1\)。那么随机加完一个字符后,结束的概率是变成了\(F(x)\),未结束的概率是\(G(x)\),所以得到了这个等式。
设\(a_i\)表示\(A[1..i]\)是否是串\(A\)的\(border\),那么我们可以得到:
\]
等式左侧的含义是在当前未结束的串的后面直接接上目标串,那么这样一定会结束。
右侧的含义是因为前面的随机串中可能已经匹配了一部分的长度,导致在匹配了一半此时就已经结束了。
那么我们插入了一半就结束了,并且此时我们插入的一定是一段前缀,因此只有可能当这个位置是\(border\)时才可能结束。
那么强制在这个\(border\)时会结束,等价于我们钦定了随机串的最后\(L-i\)位。那么就得到了右边的式子。
我们要求解的东西是\(F'(1)\),
首先第一个式子可以写成:
\]
化简得到\(F'(1)=G(1)\)
然后令\(x=1\)带入到第二个式子中,可以得到:
\]
那么只需要\(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)的更多相关文章
- 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差
[题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...
- [CTSC2006]歌唱王国
[CTSC2006]歌唱王国 Tags:题解 题意 链接:在空串后不断随机添加字符,直到出现串\(S_i\)为止.求最终串的期望长度.\(\sum |S_i|\le 5*10^6\) 题解 以下内容来 ...
- bzoi1152 [CTSC2006]歌唱王国Singleland
[CTSC2006]歌唱王国Singleland Time Limit: 30 Sec Memory Limit: 162 MB Description 在歌唱王国,所有人的名字都是一个非空的仅包含整 ...
- P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】
正题 题目链接:https://www.luogu.com.cn/problem/P4548 题目大意 \(t\)次询问,给出一个长度为\(m\)的串\(S\)和一个空串\(T\),每次在\(T\)后 ...
- 洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)
题面 传送门 给定一个长度为\(L\)的序列\(A\).然后每次掷一个标有\(1\)到\(m\)的公平骰子并将其上的数字加入到初始为空的序列\(B\)的末尾,如果序列B中已经出现了给定序列\(A\), ...
- Luogu4548 CTSC2006 歌唱王国 概率生成函数、哈希
传送门 orz ymd 考虑构造生成函数:设\(F(x) = \sum\limits_{i=0}^\infty f_ix^i\),其中\(f_i\)表示答案为\(i\)的概率:又设\(G(x) = \ ...
- 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)
洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...
- luogu P4548 [CTSC2006]歌唱王国
传送门 这题\(\mathrm{YMD}\)去年就讲了,然而我今年才做(捂脸) 考虑生成函数,设\(f_i\)表示最终串长为\(i\)的概率,其概率生成函数为\(F(x)=\sum f_ix^i\), ...
- BZOJ 1152 歌唱王国
题目传送门 分析: 这道题很神仙,我们给出低配版解法和高配版解法2333 低配版: 首先知道这样一个公式...(证明去高配版) 当一个字符串S其中S [ 1 , i ] = S [ n - i + 1 ...
随机推荐
- MyBatis模糊查询不报错但查不出数据的一种解决方案
今天在用MyBatis写一个模糊查询的时候,程序没有报错,但查不出来数据,随即做了一个测试,部分代码如下: @Test public void findByNameTest() throws IOEx ...
- Python_生产者消费者模型、管道、数据共享、进程池
1.生产者消费者模型 生产者 —— 生产数据的人 消费者 —— 消费数据的人 生产者消费者模型:供销数据不平衡的现象. import time import random from multiproc ...
- CRM系统(第二部分)
阅读目录 一.讲师与学生简介 二. 初始化 ,studyrecord, 三.初始化 course_record:批量生成学习记录 四. 考勤 url跳转 五.录入成绩 六.highcharts表 ...
- 百度地图支持https
百度地图SDK, 支持https <script src="http://api.map.baidu.com/api?v=3.0&ak=nbnttGGI6lilllgy2zn ...
- 【问题解决方案】Dev C++ 无法调试的问题与解决
听翁恺老师课的时候用到一个叫DevC++的编辑器. 学到调试部分的时候,老师的没问题我的报错.我?? 试一试网上查到的方法: 工具 --> 编译选项 --> 代码生成/优化 --> ...
- jenkins 迁移后 提示 反向代理设置有误
jenkins报:反向代理设置有误-布布扣-bubuko.comhttp://www.bubuko.com/infodetail-2038758.html [Linux][Jenkins]系统配置报反 ...
- md5加密通过URL传给后台
首先要把你要用的md5库引入 这个技术其实挺简单的,咋们直接贴上代码(这个是项目上的) sign = hex_md5("type="+type&"userId=& ...
- YOLO.h5 下载
链接:https://pan.baidu.com/s/1sTxkuaFWXqT4yXLHQ9BgUA 密码:ga0o fhwayd_w1231234asd><321$%
- IdentityServer4【Introduction】之术语
术语 在规范.文档和对象模型中使用了一些你应该了解的术语. IdentityServer IdentityServer是一个OpenID Connect的提供者,它实现了OpenID Connect和 ...
- eclipse中添加tomcat
https://blog.csdn.net/Forlogen/article/details/54090335(copy) 为了Java Web的开发,下面我们来安装一下Tomcat服务器,并将其配置 ...