4.23 子串 AC自动机 概率期望 高斯消元 考虑40分。 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止。可以发现这个状态有环 需要高斯消元。 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+1需要的期望长度。 需要预处理前缀和和KMP的nex数组来辅助转移。 if(n=...
这道题解法不唯一,比较无脑的方法是对模式串t建一个单串AC自动机,设u为自动机上的一个结点,dp[u]为从该结点出发走到终结状态时的期望步数,则dp[u]=∑(1+dp[v])/n,v为u的后继状态。特别地,终结状态的dp值为0。 这样一来,就可以列出线性方程组进行高斯消元了。由于答案非常大,用double会损失精度,所...
bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因为单词末尾节点走到意味着游戏结束,所以经过单词末尾节点的概率就是经过单词末尾节点的期望次数。为什么是期望呢,因为概率的上限是1,不能随便转移 这样定义...
HDU - 5955 Guessing the Dice Roll——ac自动机+概率dp+高斯消元,要写的就是代码中的solve函数,看一下就明白了,其余的都是模板,挺水的
然后加入∑i=1nFi(1)=1∑i=1nFi(1)=1这个等式就可以高斯消元解方程了。 ACCodeAC Code #include<bits/stdc .h> #define maxn 305 #define LL long long #define db double #define S 131ll #define eps 1e-13 #define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i ) ...
我有一点不是很懂,这样算出来转移到AC自动机根节点的概率是一个远大于1的数。 按我的理解,因为转移初始就是从根节点出发的, 所以x(0)存储的是从根节点出发的概率(100%)+其他点转移到根节点的概率…… 比较抽象,还是当做套路记住吧……(鶸的做法) ...
参照“【洛谷3232】[HNOI2013] 游走”这道题的做法,我们可以按同样的方式列出n×ln×l个方程,然后高斯消元。 在此题中,从节点xx转移到它的第ii个儿子的系数就是piqipiqi,其中xx不能是题目中给出的那些字符串所对应的节点(此时转移系数都为00)。
先建出来ACAC自动机,考虑在上面DPDP,设f[i]f[i]为在AC自动机上ii节点时期望还有多长才能结束。 若ii为一个字符串的结尾,则f[i]=0f[i]=0 然后高斯消元解方程就行了。 点我展开代码 分类:考试总结,高斯消元,AC自动机 好文要顶关注我收藏该文微信分享 ...
可以对自动机上每个结点都列一个方程,得到一个nn元一次方程组,利用高斯消元解方程即可。Code#include<bits/stdc++.h> #define rep(i,x,n) for(int i=x;i<=n;i++) #define per(i,n,x) for(int i=n;i>=x;i--)#define sz(a) int(a.size()) ...
因为跳转会回到原先的状态,因此我们可以使用高斯消元解线性方程组。假设g[i]表示AC自动机第j个位置的概率,我们只需要把不同的节点可以跳转这个位置的系数变为1 / 6即可,即如果一个节点为p,那么下一个投掷的数字为q的话,跳转到tr[p][q]tr[p][q],令j=tr[p][q]令j=tr[p][q],就令第j行的第q个...