【hiho挑战赛24 A&B&C】贪心和期望dp惨烈的后缀自动机

A题目传送门
B题目传送门
C题目传送门

A


因为太水,我不想写题解,Yvehの传送门

B


思路:
很强的一道题目(聪哥说是概率入门题……)
昨天打比赛时懵逼了很久
我们先考虑一个简单的问题,如果 a[i]=0 ,怎么做?
一道比较经典的题目(51nod 1202),给定序列 s ,求不同的子序列个数
f[i]表示到第 i 位时本质不同的子序列的个数,对于第i位来说有选和不选两种可能,那么方程就是

f[i]=f[i1]×2

但这是在 s[i] 没有出现过的情况下的方程
那如果 s[i] 之前已经出现过呢?
s[i] 最后出现的位置是 last ,那么方程就是

f[i]=f[i1]×2f[last1]

我们可以这么想,这时重复的串就是last之前的子序列分别与 s[last] , s[i] 相匹配,这些子序列的数量就是 f[last1]
这样就可以在 O(n) 时间内递推出 f[n]
但是这里加入了概率,我们怎么在这上面改进呢?
我先给出方程,下面再解释
a[i] 表示第i位被删除的概率, f[i] 表示到第 i 位时本质不同的子序列的期望,sum[i]表示 i 本身及i所有可能的 last 的前一位的期望的前缀和
咦,好像 sum[i] 的定义很诡异啊,我们来重新断下句(。・∀・)ノ゙
sum[i] 表示
i 本身及i所有可能的 last
的前一位
的期望
的前缀和
如果没看懂就继续往下看好了= =
f[i]=(f[i1]×2sum[last])×(1a[i])+f[i1]×a[i]

sum[i]=f[i1]×(1a[i])+sum[last]×a[i]

考虑第 i 位时,如果第i位被删除了,那么第 i 位的的期望就是前一位的期望(即f[i1]),如果没被删除,那么就可以仿照 a[i]=0 时的情况了,但这时我们发现,last的位置并不是固定的,而是有多种可能的,在这里,朴素的想法是枚举所有可能的 last ,然后累加它们的不被删除时前一位的 f ,得出答案,但这个转移最坏情况下是O(n)的,所以考虑前缀和优化, sum[i] 就是做这个用的
sum[i] 的求法也很简单,类似 f[i] ,如果 i 没被删除,那就是f[i1],反之就是 sum[last]
乘下相应的概率就可以了
由于要取模,所以先求下 100 关于 998244353 的逆元
时间复杂度和空间复杂度都是 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

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值