P6125 [JSOI2009]有趣的游戏(高斯消元+ac自动机)
发布日期:2021-06-30 10:30:33 浏览次数:2 分类:技术文章

本文共 1452 字,大约阅读时间需要 4 分钟。

显然对 n n n个玩家的序列建立 a c ac ac自动机

高斯消元

其实这是个无限循环游戏,因为轮次可以是无限的

我们直接定义 f [ i ] f[i] f[i]表示最终停在自动机节点 i i i的概率,下面的 p i , j p_{i,j} pi,j表示节点 i i i到节点 j j j的概率

显然非终止节点的 f [ i ] = 0 f[i]=0 f[i]=0

至于求终止节点的 f [ i ] f[i] f[i],是从若干个非终止节点转移而来的,知道非终止节点的 f [ j ] f[j] f[j]没有意义,无法转移

那我们变一下,定义 f [ i ] f[i] f[i]表示经过节点 i i i的概率

对于节点 i i i来说,转移方程为 f [ i ] + = f [ j ] ∗ p j , i f[i]+=f[j]*p_{j,i} f[i]+=f[j]pj,i,当然 j j j不能是终止节点

对于根节点来说一开始就经过了根节点, f [ 0 ] = 1 f[0]=1 f[0]=1

然后去高斯消元,发现 w a wa wa了…

发现问题是根节点会转移出去,然后有一些节点又会回到根节点,这样到根节点的概率是不是还大于1了呢??

这使得定义出现问题,需要再次更换思路

定义 f [ i ] f[i] f[i]为经过节点 i i i的期望次数

那么对于终止节点来说,经过的期望其实就是概率

因为对于根节点,一开始就经过了一次,其中 p i , j p_{i,j} pi,j表示 i i i转移到 j j j的概率

f [ 0 ] = 1 + f [ j ] ∗ p j , 0 f[0]=1+f[j]*p_{j,0} f[0]=1+f[j]pj,0

对于一般节点

f [ i ] = f [ j ] ∗ p j , i f[i]=f[j]*p_{j,i} f[i]=f[j]pj,i

高斯消元即可

#include 
using namespace std;const int maxn = 1009;const double eps = 1e-9;int n,l,m;double p[maxn],mp[maxn][maxn];int zi[maxn][30],ID[maxn],id,fail[maxn],vis[maxn];char a[maxn];void insert(char a[],int index ){
int n = strlen( a+1 ), now = 0; for(int i=1;i<=n;i++) {
if( !zi[now][a[i]-'A'] ) zi[now][a[i]-'A'] = ++id; now = zi[now][a[i]-'A']; } ID[index] = now; vis[now] = 1;}void make_fail(){
queue
q; for(int i=0;i
> n >> l >> m; for(int i=0;i
> ( a+1 ); insert( a,i ); } make_fail(); mp[0][id+1] = 1; for(int i=0;i<=id;i++) {
mp[i][i] = 1; if( vis[i] ) continue; for(int j=0;j

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/114582120 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:P3706 [SDOI2017]硬币游戏(高斯消元+概率)
下一篇:牛客练习赛63 F.牛牛的树行棋(启发式合并+sg打表)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月05日 14时56分43秒