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

题面

BZOJ

题解

先把\(AC\)自动机构建出来,最好构成\(Trie\)图。然后这样子显然是在一个有向图中有一堆概率的转移,并且存在环,所以高斯消元解决。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct Node{int son[26],fail,lst;}t[500];
int tot,n,m,l,pos[20];
char ch[50];
double g[200][200],p[50];
void insert(char *s,int id)
{
int u=0;
for(int i=1;i<=l;++i)
{
if(!t[u].son[s[i]-65])
t[u].son[s[i]-65]=++tot;
u=t[u].son[s[i]-65];
}
t[u].lst=id;pos[id]=u;
}
void Build()
{
queue<int> Q;
for(int i=0;i<m;++i)if(t[0].son[i])Q.push(t[0].son[i]);
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=0;i<m;++i)
if(t[u].son[i])
t[t[u].son[i]].fail=t[t[u].fail].son[i],Q.push(t[u].son[i]);
else t[u].son[i]=t[t[u].fail].son[i];
t[u].lst|=t[t[u].fail].lst;
}
}
void Gauss()
{
for(int i=0;i<=tot;++i)
{
int p=0;
for(int j=i;j<=tot;++j)
if(g[j][i]){p=j;break;}
for(int j=0;j<=tot+1;++j)swap(g[i][j],g[p][j]);
double t=g[i][i];
for(int j=0;j<=tot+1;++j)g[i][j]/=t;
for(int j=i+1;j<=tot;++j)
{
double d=g[j][i];
for(int k=0;k<=tot+1;++k)
g[j][k]-=g[i][k]*d;
}
}
for(int i=tot;~i;--i)
{
g[i][tot+1]/=g[i][i];
for(int j=i-1;j>=0;--j)
g[j][tot+1]-=g[j][i]*g[i][tot+1];
if(!g[i][tot+1])g[i][tot+1]=0;
}
}
int main()
{
scanf("%d%d%d",&n,&l,&m);
for(int i=0;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
p[i]=1.0*a/b;
}
for(int i=1;i<=n;++i)
{
scanf("%s",ch+1);
insert(ch,i);
}
Build();
for(int i=0;i<=tot;++i)
for(int j=0;j<m;++j)
if(!t[i].lst)
g[t[i].son[j]][i]+=p[j];
for(int i=0;i<=tot;++i)g[i][i]-=1;
for(int i=0;i<=tot;++i)if(t[i].lst)g[0][i]=1;else g[0][i]=0;g[0][tot+1]=1;
Gauss();
for(int i=1;i<=n;++i)printf("%.2lf\n",g[pos[i]][tot+1]);
return 0;
}

【BZOJ1444】[JSOI2009]有趣的游戏(高斯消元,AC自动机)的更多相关文章

  1. [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)

    [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...

  2. [Sdoi2017]硬币游戏 [高斯消元 KMP]

    [Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...

  3. 【bzoj3105】[cqoi2013]新Nim游戏 高斯消元求线性基

    题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从 ...

  4. BZOJ1444 : [Jsoi2009]有趣的游戏

    建立AC自动机,并求出转移矩阵. 再用$\sum E(终止节点)=1$去替换第一个方程,高斯消元即可. 时间复杂度$O(n^3l^3)$. 注意精度问题,要特判0.00的情况. #include< ...

  5. BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

    以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...

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

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

  7. [BZOJ4820][SDOI2017]硬币游戏(高斯消元+KMP)

    比较神的一道题,正解比较难以理解. 首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可. 可以证明,AC自动机上所有不是模式串终止节点的点可以看成一 ...

  8. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

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

    题目描述 输入 注意 是0<=P, n , l, m≤ 10. 输出 样例输入 input 1 3 2 2 1 2 1 2 AB BA AA input 2 3 4 2 1 2 1 2 AABA ...

  10. BZOJ1444:[JSOI2009]有趣的游戏(AC自动机,矩阵乘法)

    Description Input 注意 是0<=P, n , l, m≤ 10. Output Sample Input input 1 3 2 2 1 2 1 2 AB BA AA inpu ...

随机推荐

  1. 你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View - 转

    http://blog.csdn.net/carson_ho/article/details/77712072

  2. XSS Challenges练习及解答

    一个偶然的机会在知道创宇的技能表里看到了一个练习XSS的网站http://xss-quiz.int21h.jp,正好想研究这个,于是试着做了一下. 第一.二题是最简单的,直接在搜索框中输入以下代码就成 ...

  3. 20155237方自晨 实验四android开发基础

    提交点一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 安装 A ...

  4. Exp9 Web安全基础实践

    Exp9 Web安全基础实践 基础问题回答 1.SQL注入攻击原理,如何防御? 对用户的输入进行校验,可以通过正则表达式,双"-"进行转换等. 不要使用动态拼装sql,可以使用参数 ...

  5. [Oracle][Corruption]究竟哪些检查影响到 V$DATABASE_BLOCK_CORRUPTION

    根据 471716.1,11g 之后,下列动作如果遇到坏块,都会输出记录到  V$DATABASE_BLOCK_CORRUPTION. -  Analyze table .. Validate str ...

  6. 变量内存空间的释放---c语言

    堆栈内存释放: 栈的内存是由编译器自动分配.释放,出了作用域就释放. 堆的内存由程序员分配.释放,他的作用域是整个程序,如果程序没有释放,程序结束时会自动释放.

  7. libgdx学习记录17——照相机Camera

    照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. C ...

  8. vs2017 用 nuget发布包时报错

    安装了 vs2017后, 发布nuget 时报错: Failed to load msbuild Toolset 未能加载文件或程序集"Microsoft.Build, Version=14 ...

  9. 网站遭受大量CC攻击后的应对策略

    上周开始我网站遭受了一大波CC攻击,到目前为止仍在继续,作为一个建站小白,我感觉压力好大,又有新的问题要挑战了! 服务器架设在腾讯云,CC攻击很凶猛,带宽瞬间占满,于是在腾讯云后台配置安全组关闭了80 ...

  10. Qt QpushButton 实现长按下功能

    做项目需要一个按钮具备长时间按下的功能,才发现Qt原始的按钮是没有这个功能,不过Qt的原生按钮是存在按下和释放信号的,有了这两个信号,再来实现按钮长时间被按下,这就简单了,看下动画演示. 录成GIF效 ...