LINK:有趣的游戏

直接说做法了。首先是 我是不会告诉你我看完题后不太会 摸了2h鱼后看题解 一直翻发现自己题目有些没读完整。。

题目中说了每个字符串长度相同 而我一直在思考AC自动机可能存在一些节点是不合法的且其还是其他节点的fail节点这个时候我很茫然不知道怎么dp了。。

实际上 长度相同那么一定不存在上述情况 发生 那么久很好解决了 我们很容易就可以列出来概率矩阵。

显然是存在一些环的问题的 对于终止节点我们定义其不向其他节点做出概率贡献。

然后我们利用这个矩阵不断的自乘进行概率的转移 最后会不断收敛 最后就是第一行的值了 (至于为什么 自己思考。

当然我们也应该知道这个应该是收敛的 因为可以考虑两种情况 多种概率不断交换的 但是其值不变的 乘多少次都无效。 对于概率改变的 我们自乘矩阵几十次也相当于一个矩阵被我们乘了2^几十次 这个是非常庞大的所以该转移的概率显然也转移完了 我们把后面的精度忽略掉就是正确答案。

当然这个思路并不是那么顺畅 比较顺的是 高斯消元啊 遇到有环的问题 首选高消且这个数据范围还支持高消。

设f[i]表示到达第i个点的期望次数 列出来i的转移方程。

可以发现 f[0]=1+... 因为初始是1 我们将这n个方程组解一下即可得到到达每个点的期望次数。同时注意终止节点始终不贡献转移。

可以发现最后求的是概率 感性的理解 这里的期望次数其实就是概率 可以这样考虑 我们初始只有f[0]=1 这个表示了0被期望经过的次数。

除了0这个节点 其余的所有节点都是从0出发来经过的 0到他们的期望次数显然<1 且 这是和概率有关的 概率*结果=次数 我们发现这个结果被定义为单位1了即经过就是经过了 没有经过就没有经过 所以此处概率等于次数。

综上这道题两种方法均可。

const int MAXN=110;
int n,m,l,cnt;
char ch[MAXN];
int t[MAXN][10],fail[MAXN],pos[MAXN],c[MAXN],q[MAXN];
db a[MAXN][MAXN],p[MAXN];
inline void get_fail()
{
int l=0,r=0;
for(int i=0;i<m;++i)if(t[0][i])q[++r]=t[0][i];
while(++l<=r)
{
int x=q[l];
for(int i=0;i<m;++i)
{
if(t[x][i])fail[t[x][i]]=t[fail[x]][i],q[++r]=t[x][i];
else t[x][i]=t[fail[x]][i];
}
}
}
inline void GAUSS()//普通高消
{
for(int i=0;i<=cnt;++i)//寻找第i个主元
{
int p=i;
for(int j=i+1;j<=cnt;++j)
if(fabs(a[j][i])>fabs(a[p][i]))p=j;
if(i!=p)rep(0,cnt+1,j)swap(a[p][j],a[i][j]);
for(int j=0;j<=cnt;++j)//约旦消元
{
if(i==j)continue;
db d=a[j][i]/a[i][i];
for(int k=0;k<=cnt+1;++k)a[j][k]-=a[i][k]*d;
}
}
rep(0,cnt,i)a[i][cnt+1]/=a[i][i];
}
int main()
{
freopen("1.in","r",stdin);
gt(n);gt(l);gt(m);
rep(1,m,i)
{
int x,y;gt(x);gt(y);
p[i-1]=(db)x/y;
}
rep(1,n,i)
{
scanf("%s",ch+1);
int p=0;
rep(1,l,j)
{
int w=ch[j]-'A';
if(!t[p][w])t[p][w]=++cnt;
p=t[p][w];
}
pos[i]=p;c[p]=1;
}
get_fail();
for(int i=0;i<=cnt;++i)
{
a[i][i]+=-1;
if(c[i])continue;
for(int j=0;j<m;++j)
{
int tn=t[i][j];
//cout<<i<<' '<<tn<<endl;
a[tn][i]+=p[j];
}
}
a[0][cnt+1]=-1;
//rep(0,cnt,i){rep(0,cnt+1,j)cout<<a[i][j]<<' ';cout<<endl;}
GAUSS();
rep(1,n,i)if(fabs(a[pos[i]][cnt+1])<EPS)puts("0.00");else printf("%.2lf\n",a[pos[i]][cnt+1]);
return 0;
}

luogu P6125 [JSOI2009]有趣的游戏的更多相关文章

  1. BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  2. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]

    1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...

  3. BZOJ 1444:[JSOI2009]有趣的游戏

    BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...

  4. BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1382  Solved: 498[Submit][Statu ...

  5. 【BZOJ1444】[JSOI2009]有趣的游戏(高斯消元,AC自动机)

    [BZOJ1444][JSOI2009]有趣的游戏(高斯消元,AC自动机) 题面 BZOJ 题解 先把\(AC\)自动机构建出来,最好构成\(Trie\)图.然后这样子显然是在一个有向图中有一堆概率的 ...

  6. 1444: [Jsoi2009]有趣的游戏

    1444: [Jsoi2009]有趣的游戏 链接 分析: 如果一个点回到0号点,那么会使0号点的概率增加,而0号点的概率本来是1,不能增加,所以这题用期望做. 设$x_i$表示经过i的期望次数,然后初 ...

  7. 【bzoj1444】[Jsoi2009]有趣的游戏

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1007  Solved: 334[Submit][Statu ...

  8. [JSOI2009] 有趣的游戏

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1800  Solved: 645[Submit][Statu ...

  9. 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法

    [BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT  30%的 ...

随机推荐

  1. 实现 React Hooks

    实现 React Hooks UI 开发有两个问题: 展示复用 逻辑复用 展示复用目前基本使用组件化来解决,逻辑复用一直以来都没有特别好的解决方案.React 从一开始的 mixin ,到 高阶组件 ...

  2. SCOI 2009 围豆豆(状压DP)

    SCOI 2009 围豆豆 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧. 游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗 ...

  3. day23 常用模块(中)

    目录 一.json&pickle模块 1 什么是序列化 2 为什么要序列化 2.1 持久保存状态 2.2 跨平台数据交互 3 如何序列化 二.shelve模块 三.configparser模块 ...

  4. bzoj2843极地旅行社

    bzoj2843极地旅行社 题意: 一些点,每个点有一个权值.有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法) 题解: 以前一直想不通为什么神犇们的模板中LCT在 ...

  5. Ant-Design-Vue中关于Form组件的使用

    1.创建form表单的两种方式,不同的方式在js中创建表单的方式也不同 方式1:一般使用在搜索表单中,只需要双向绑定数据即可,那就使用这种方法即可 <template> <a-for ...

  6. Android 性能优化 ---- 内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应 ...

  7. 数据结构C语言实现----出队伍操作

    1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL 2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历 ...

  8. P4547 [THUWC2017]随机二分图(状压,期望DP)

    期望好题. 发现 \(n\) 非常小,应该要想到状压的. 我们可以先只考虑 0 操作. 最难的还是状态: 我们用 \(S\) 表示左部点有哪些点已经有对应点, \(T\) 表示右部点有哪些点已经有对应 ...

  9. shell脚本sql赋值

    以下脚本功能是用shell脚本登录sqlplus连接oracle,将执行sql语句查询的结果赋值给shell脚本中的变量 #!/bin/bash echo "开始连接数据库..." ...

  10. DJANGO-天天生鲜项目从0到1-005-FastDFS与Nginx打造自定义文件存储系统

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...