bzoi1152 [CTSC2006]歌唱王国Singleland
[CTSC2006]歌唱王国Singleland
Time Limit: 30 Sec Memory Limit: 162 MB
Description
在歌唱王国,所有人的名字都是一个非空的仅包含整数1~n的字符串。王国里生活着一大群咕噜兵,他们靠不停的
歌唱首领——牛人酋长们的名字来获取力量。咕噜兵每一次歌唱过程是这样的:首先,他从整数生成器那儿获得一
个数字,然后花一个时间单位将此数字唱出来,如果他发现某个牛人酋长的名字已经被歌唱出来(即此名字是歌唱
序列的一个连续子串),那么这次歌唱过程就立即结束。相关名词定义歌唱序列:如果某人歌唱了x个数字,第i次
歌唱的数字为ai,那么歌唱序列=(a1,a2,…,ax)。整数生成器:歌唱王国的神物,它有一个按钮,如果你按一下按
钮,将从1~n数字中等概率的随机返回一个整数。歌唱时间:在一次歌唱过程中花费的时间。歌唱时间是随机的,
无法预料;不过歌唱时间的期望值是固定的,此期望值即平均来说歌唱时间有多长,亦可称作平均歌唱时间。王国
里的人非常喜欢歌唱,他们希望歌唱的时间越长越好,所以他们决定罢免一些牛人酋长,使得平均歌唱时间变长。
但是他们不能罢免掉所有的牛人酋长,否则他们每次歌唱都无法停止,无法获取力量;于是他们决定只保留一个牛
人酋长而罢免其余的牛人酋长。你的任务是:对于给定的n、牛人酋长的个数t以及每一个牛人酋长的名字,告诉王
国里的人们,对于1≤i≤t,如果保留第i个牛人酋长,罢免掉其余的,那么平均歌唱时间将是多少。提示:此数为
一个非负整数!输出要求:由于这个数字太大,所以你只需输出这个数的末4位数字。如果不足4位,则前面补0(见
样例)。
Input
第一行,两个整数n、t;以下t行描述t个牛人酋长名字。
文件第i+1(1≤i≤t)行格式如下
第一个数为mi表示第i个牛人酋长的名字的长度,在一个空格之后,
接下来有mi个数,用来描述这个牛人酋长的名字,相邻两个整数之间用一个空格分开。
1≤n≤105,t≤50,1≤mi≤105
Output
共 t 行,第 i 行为一个整数,表示若保留第 i 个牛人酋长而罢免其余的,则平均歌唱时间最长的末四位数字是多少。
Sample Input
2 2
1 1
3 1 2 1
Sample Output
0002
0010
这大概是个结论。。。
就是说你求出这个东西的 fail 数组。。。
然后呢。。。你从最后一个开始跳 fail 链
每次把 (字符集大小)的fail【x】次方加入答案。。。
等我证一下
挑战失败。。。
看了个很不错的blogs。。。
https://www.zhihu.com/question/59895916/answer/196874145
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, mod = 10000;
int n, t, len, ans, s[N], fail[N], pw[N];
inline void KMP()
{
memset(fail, 0, sizeof(fail));
for(int i = 2; i <= len; ++i){
int lin = fail[i - 1];
while(lin && s[lin + 1] != s[i]) lin = fail[lin];
if(s[i] == s[lin + 1]) fail[i] = lin + 1;
}
}
inline void prepare()
{
pw[0] = 1;
for(int i = 1; i < N; ++i) pw[i] = pw[i - 1] * n % mod;
}
inline void print()
{
ans = 0; int p = len;
while(p){
ans = (ans + pw[p]) % mod;
p = fail[p];
}
if(ans < 1000) printf("0");
if(ans < 100) printf("0");
if(ans < 10) printf("0");
printf("%d\n", ans);
}
int main()
{
scanf("%d%d", &n, &t); prepare();
while(t--){
scanf("%d", &len);
for(int i = 1; i <= len; ++i) scanf("%d", &s[i]);
KMP();
print();
}
return 0;
}
/*
1 9
36 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
*/
bzoi1152 [CTSC2006]歌唱王国Singleland的更多相关文章
- 【BZOJ】1152: [CTSC2006]歌唱王国Singleland
题解 读错题了,是最后留下一个牛人首长歌颂他,和其他人没有关系,t就相当于数据组数 结论题,具体可看 https://www.zhihu.com/question/59895916/answer/19 ...
- [CTSC2006]歌唱王国
[CTSC2006]歌唱王国 Tags:题解 题意 链接:在空串后不断随机添加字符,直到出现串\(S_i\)为止.求最终串的期望长度.\(\sum |S_i|\le 5*10^6\) 题解 以下内容来 ...
- 洛谷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) = \ ...
- luogu P4548 [CTSC2006]歌唱王国
传送门 这题\(\mathrm{YMD}\)去年就讲了,然而我今年才做(捂脸) 考虑生成函数,设\(f_i\)表示最终串长为\(i\)的概率,其概率生成函数为\(F(x)=\sum f_ix^i\), ...
- 题解 [CTSC2006]歌唱王国
题目传送门 Desctiption 见题面. Solution 人类智慧... 考虑这样一个赌博游戏,现在有一个猴子,它随机从 \(1\sim n\) 中选一个打出来.现在有若干个赌徒,他们一开始都有 ...
- 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)
洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...
- 【BZOJ1152】歌唱王国(生成函数,KMP)
[BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...
- 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差
[题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...
随机推荐
- 在css里如何控制表单中文本的value内的文字的位置,比方说让它向右移动2px
方法1:比较简单的方法是将文本放到一个容器中(div,span,a等等)然后给容器设置样式,通过控制容器的位置来达到控制字体位置.(margin-left:10px; margin-top:15px; ...
- 1.ireport基本使用
1. 2.
- SELECT - 从表或视图中取出若干行
SYNOPSIS SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [ ...
- 批量定时任务将rtf文件转为docx,入参是rtf文件夹,生成一个docx文件夹
java,python等语言对于rft的处理很受限,rtf提供了很少的api供外部调用处理,但是对于docx我们却又很多api来处理,所以很多人会有需求将rtf批量转为docx的需求,接下来就来说说解 ...
- python基础:5.请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 ...
- 01.springboot入门--启用自动配置注解EnableAutoConfiguration
springboot入门 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- Python 类的属性和实例属性 Python 的动态语言
#定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa = 10... #对类 Aa实例化出一个实例 a1>>> a1 = Aa() &g ...
- spark大数据快速分析第二章
1.驱动程序通过一个SparkContext对象来访问Spark,此对象代表对计算集群的一个连接.shell已经自动创建了一个SparkContext对象.利用SparkContext对象来创建一个R ...
- Ubuntu用户权限管理(chown, chmod)
改变文件所有权chown 例如 sudo chown username myfile myfile文件的所有权变为username. chown -R username /files/work 加入参 ...
- vue项目轮播图的实现
利用 Vue-Awesome-Swiper插件来做轮播效果,github地址:https://github.com/surmon-china/vue-awesome-swiper 安装 npm i ...