https://blog.sengxian.com/solutions/bzoj-1444 orz

一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因为单词末尾节点走到意味着游戏结束,所以经过单词末尾节点的概率就是经过单词末尾节点的期望次数。为什么是期望呢,因为概率的上限是1,不能随便转移

这样定义状态之后,得到dp转移为

\[f[i]=\sum_{pr节点可以通过字符c转移到i节点}p[c]*f[pr]
\]

因为是期望,所以root节点右边要加1

然后移项做高斯消元即可

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const int N=105;
int n,l,m,c[N][15],tot=1,fa[N],va[N],fl,id[N];
double p[N],a[N][N],d[N];
char s[N];
void gaosi(int n)
{
for(int i=1;i<=n;i++)
{
int nw=i;
for(int j=i+1;j<=n;j++)
if(fabs(a[nw][i])<fabs(a[j][i]))
nw=j;
for(int j=i;j<=n+1;j++)
swap(a[nw][j],a[i][j]);
for(int j=i+1;j<=n+1;j++)
a[i][j]/=a[i][i];
a[i][i]=1;
for(int j=i+1;j<=n;j++)
{
for(int k=i+1;k<=n+1;k++)
a[j][k]-=a[j][i]*a[i][k];
a[j][i]=0;
}
}
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
a[i][n+1]-=a[j][n+1]*a[i][j];
}
int main()
{
scanf("%d%d%d",&n,&l,&m);
for(int i=0,x,y;i<m;i++)
{
scanf("%d%d",&x,&y);
p[i]=(double)x/(double)y;
}
for(int ca=1;ca<=n;ca++)
{
scanf("%s",s+1);
int nw=1,f=0;
for(int i=1;i<=strlen(s+1);i++)
{
if(p[s[i]-'A']<1e-8)
f=1;
if(!c[nw][s[i]-'A'])
c[nw][s[i]-'A']=++tot;
nw=c[nw][s[i]-'A'];
}
va[nw]=1;
id[ca]=tot;//cerr<<id[ca]<<endl;
fl+=f;
}
if(fl==n)
{
for(int i=1;i<=n;i++)
puts("0.00");
return 0;
}
queue<int>q;
for(int i=0;i<m;i++)
if(c[1][i])
fa[c[1][i]]=1,q.push(c[1][i]);
else
c[1][i]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<m;i++)
if(c[u][i])
fa[c[u][i]]=c[fa[u]][i],q.push(c[u][i]);
else
c[u][i]=c[fa[u]][i];
}
a[1][1]=-1,a[1][tot+1]=-1;
for(int i=1;i<=tot;i++)
{
if(i>1)
a[i][i]--;
if(va[i])
continue;
for(int j=0;j<m;j++)
a[c[i][j]][i]+=p[j];
}//cerr<<tot<<endl;
gaosi(tot);
// for(int i=1;i<=tot;i++)
// {
// for(int j=1;j<=tot+1;j++)
// cerr<<a[i][j]<<" ";
// cerr<<endl;
// }
for(int i=1;i<=n;i++)
printf("%.2f\n",a[id[i]][tot+1]/a[id[i]][id[i]]);
return 0;
}

bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】的更多相关文章

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

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

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

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

  3. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...

  4. BZOJ 1444: [Jsoi2009]有趣的游戏 AC自动机+概率与期望+矩阵乘法

    这道题还比较友好~首先,构建出来 $AC$ 自动机,那么我们要求的就是从 $0$ 号点走无限次走到一个终止节点的概率. 考虑构建转移矩阵 $M,$ $M_{i,j}$ 表示节点 $i$ 转移到节点 $ ...

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

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

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

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

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

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

  8. ●BZOJ 1444 [Jsoi2009]有趣的游戏

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1444题解.1: 概率dp,矩阵乘法,快速幂. 对所有串建立AC自动机, 那么如果在trie树 ...

  9. bzoj1444[Jsoi2009]有趣的游戏[AC自动机]

    题面 bzoj 我要向师父学习善待每一只数据结构 考虑成环,那么高斯消元 然鹅这道题太小了 所以直接转移矩阵自乘就好啦 终点不向外连边 有一条向自己的,概率为一的自环来作为结尾 对于其他店 若有边\( ...

随机推荐

  1. MySQL的字符串连接函数CONCAT, CONCAT_WS,GROUP_CONTACT

    本文转载自de.cel<MySQL的字符串连接函数CONCAT, CONCAT_WS,GROUP_CONCAT>   在搜索Mysql中怎么实现把一列的多行数据合并成一行时,找到了grou ...

  2. 如何评价ionic和react native?

    Q:对于开发hybird app首选哪个好?是ionic还是react native?如何评价ionic和react native? A: 我看好React系,React系以正确地姿势,专注地做了正确 ...

  3. spring/spring boot/spring mvc中用到的注解

    在spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了解决EJB等大型企业框架对应用程序的侵入性,因此大量依靠配置文件来“非侵入式”得给POJ ...

  4. easyui combotree选项重复

    现象 编辑,赋值出现重复选项 原因 值之间有空格,比如我取值是3, 4, 6要改成3,4,6 注意:数值之间的空格去掉了

  5. java 返回json数据

    Student st1 = new Student(1, "dg", 18, new Date());            Student st2 = new Student(2 ...

  6. notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比方lua、python等)

    在程序开发过程中,程序猿经经常使用到的一个功能就是查找引用(Find Reference).Visual Studio里面的相应功能是"查找全部引用"(Find All Refer ...

  7. [Sciter] Script与Native交互

    原帖地址:http://www.cnblogs.com/yinxufeng/p/5653920.html Script与Native交互基础简化方式Script调用NativeNative调用Scri ...

  8. /etc/profile与/etc/bashrc、交互式与非交互式、login与non-login shell的差别

    线上的memcached又挂了.仍然没有得到core文件. 排查原因,同事发现启动memcached的脚本存在可疑问题. 问题一:没有设置memcached工作文件夹,有可能core dump时没有工 ...

  9. HDU 1015 Safecracker(第一次用了搜索去遍历超时,第二次用for循环能够了,思路一样的)

    Safecracker Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total S ...

  10. Android-shareSDK

    1.当数据: 地址:http://sharesdk.mob.com/Download 2.集成数据: DOS命令: java -jar QuickIntegrater.jar    (输入自己的项目名 ...