【hiho挑战赛24 ABC】贪心和期望dp惨烈的后缀自动机
A题目传送门
B题目传送门
C题目传送门
A
因为太水,我不想写题解,Yvehの传送门
B
思路:
很强的一道题目(聪哥说是概率入门题……)
昨天打比赛时懵逼了很久
我们先考虑一个简单的问题,如果a[i]=0a[i]=0,怎么做?
一道比较经典的题目(51nod 1202),给定序列ss,求不同的子序列个数
f[i]f[i]表示到第ii位时本质不同的子序列的个数,对于第i位来说有选和不选两种可能,那么方程就是
f[i]=f[i-1]×2
但这是在s[i]s[i]没有出现过的情况下的方程
那如果s[i]s[i]之前已经出现过呢?
设s[i]s[i]最后出现的位置是lastlast,那么方程就是
f[i]=f[i-1]×2-f[last-1]
我们可以这么想,这时重复的串就是last之前的子序列分别与s[last]s[last],s[i]s[i]相匹配,这些子序列的数量就是f[last−1]f[last-1]
这样就可以在O(n)O(n)时间内递推出f[n]f[n]了
但是这里加入了概率,我们怎么在这上面改进呢?
我先给出方程,下面再解释
a[i]a[i]表示第i位被删除的概率,f[i]f[i]表示到第ii位时本质不同的子序列的期望,sum[i]sum[i]表示ii本身及ii所有可能的lastlast的前一位的期望的前缀和
咦,好像sum[i]sum[i]的定义很诡异啊,我们来重新断下句(。・∀・)ノ゙
sum[i]sum[i]表示
ii本身及ii所有可能的lastlast
的前一位
的期望
的前缀和
如果没看懂就继续往下看好了= =
f[i]=(f[i-1]×2-sum[last])×(1-a[i])+f[i-1]×a[i]
sum[i]=f[i-1]×(1-a[i])+sum[last]×a[i]
考虑第ii位时,如果第ii位被删除了,那么第ii位的的期望就是前一位的期望(即f[i−1]f[i-1]),如果没被删除,那么就可以仿照a[i]=0a[i]=0时的情况了,但这时我们发现,last的位置并不是固定的,而是有多种可能的,在这里,朴素的想法是枚举所有可能的lastlast,然后累加它们的不被删除时前一位的ff,得出答案,但这个转移最坏情况下是O(n)O(n)的,所以考虑前缀和优化,sum[i]sum[i]就是做这个用的
sum[i]sum[i]的求法也很简单,类似f[i]f[i],如果ii没被删除,那就是f[i−1]f[i-1],反之就是sum[last]sum[last]
乘下相应的概率就可以了
由于要取模,所以先求下100100关于998244353998244353的逆元
时间复杂度和空间复杂度都是O(n)O(n)
代码:
#include<cstdio>
#include<iostream>
#define M 500003
#define mo 998244353
#define LL long long
using namespace std;
int n;
char s[M];
int a[M],last[27],f[M],sum[M];
int qr(int x,int y)
{int t=1;for (;y;y>>=1,x=(LL)x*x%mo)if (y&1) t=(LL)t*x%mo;return t;
}
main()
{scanf("%d",&n);scanf("%s",s+1);for (int i=1;i<=n;++i) scanf("%d",a+i);int inv=qr(100,mo-2);f[0]=1;for (int i=1;i<=n;++i){int t=sum[last[s[i]-'a']];f[i]=((100-a[i])*(2LL*f[i-1]%mo-t)%mo+(LL)a[i]*f[i-1]%mo)%mo*inv%mo;sum[i]=((LL)f[i-1]*(100-a[i])%mo+(LL)t*a[i]%mo)*inv%mo;last[s[i]-'a']=i;}printf("%d\n",(f[n]+mo)%mo);
}
C
因为太神太麻烦不想写题解了
Yvehの传送门
有没有被骗到啊(。・∀・)ノ
B题写这么详细已经很良心的啦QAQ
【hiho挑战赛24 ABC】贪心和期望dp惨烈的后缀自动机相关推荐
- 【hiho】127 后缀自动机一·基本概念 【后缀自动机】
传送门:后缀自动机一·基本概念 后缀自动机(Suffix Automaton,简称SAM)是处理字符串的很强大的工具,对于一个字符串S,它对应的后缀自动机是一个最小的确定有限状态自动机(DFA),接受 ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- string (KMP+期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一个由且仅由字符 'H' , 'T' 构成的字符串$S$. 给定一个最初为空的字符串 ...
- Wannafly挑战赛24
Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...
- 【BZOJ4008】【HNOI2015】亚瑟王 [期望DP]
亚瑟王 Time Limit: 20 Sec Memory Limit: 512 MB [Submit][Status][Discuss] Description 小 K 不慎被 LL 邪教洗脑了, ...
- 【BZOJ2553】禁忌,AC自动机+期望DP+矩乘
传送门 先考虑选最多禁忌串的问题 感受一下,如果禁忌串之间没有包含关系,一定是可以从前往后贪心搞的,直接建AC自动机跑匹配,找到一个禁忌串的末尾就回到根上,并把禁忌串数量+1 (所以起初我想的是把包含 ...
- POJ 2096 Collecting Bugs:期望dp
题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属 ...
- 【期望dp 质因数分解】cf1139D. Steps to One
有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...
- luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...
最新文章
- transition标签_图解直到今天也没什么人知道的原生dialog标签(非常详细)
- Jquery性能优化(转自蓝色理想)
- python爬虫必会的23个项目
- Scala 闭包详解
- Two Arrays and Sum of Functions
- python模型预测_python:目标检测模型预测准确度计算方式(基于IoU)
- disk genius_如何预约Apple Store商店或Genius Bar
- 2021年全球知名开源项目大更新
- 详解两种C#自动实现DLL(OCX)控件注册的方法
- mysql存储过程in_在MySQL存储过程中使用WHERE IN()
- scapy python_Scapy在Python脚本中
- OpenCV版本与EmguCV版本匹配问题
- 关于引力波的一些疑问
- python可变参数_Python学习之路:函数传递可变参数与不可变参数,每天学一点点...
- 计算机广告制作教程,Photoshop实例教程:制作网站横条广告
- 怎么用ps做一个黑底白字_ps怎么把白底黑字变成黑底白字
- 3. 二叉哥的二叉树
- 华为交换机常用查看命令
- mysql数据库表空间压缩,表空间中有数据也可以压缩表空间(数据文件)大小!!...
- 【网络时间同步】基于马尔科夫随机场最大后验估计和Gardner环的无线传感器网络时间同步算法matlab仿真