http://blog.csdn.net/viphong/article/details/53098489

我有一点不是很懂,这样算出来转移到AC自动机根节点的概率是一个远大于1的数。

按我的理解,因为转移初始就是从根节点出发的,

所以x(0)存储的是从根节点出发的概率(100%)+其他点转移到根节点的概率……

比较抽象,还是当做套路记住吧……(鶸的做法)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
#define N 110
double B[N][N+1],A[N][N+1],x[N],b[N];
int ma[13],size;
void guass_jordan()
{
int n=size;
memcpy(B,A,sizeof(A));
for(int i=1;i<=n;++i)
B[i][n+1]=b[i];
for(int i=1;i<=n;++i)//枚举:正在消除第i个未知数,之后第i个方程废掉,矩阵行、列-1
{
int pivot=i;
for(int j=i+1;j<=n;++j)//枚举j:把正在处理的未知数的系数的绝对值最大的方程换到第i行
if(fabs(B[j][i])>fabs(B[pivot][i]))
pivot=j;
swap(B[i],B[pivot]);
//if(fabs(B[i][i])<EPS)
//若所有(最大)的该未知数系数为0,说明少一个未知数,有无穷多解
for(int j=i+1;j<=n+1;++j)
B[i][j]/=B[i][i];
for(int j=1;j<=n;++j)
if(i!=j)//枚举所有的方程,从第j个方程中消去第i个未知数
for(int k=i+1;k<=n+1;++k)//依次把第j个方程中的第k个未知数减去应减的数值
B[j][k]-=B[j][i]*B[i][k];
}
for(int i=1;i<=n;++i) x[i]=B[i][n+1];
}
queue<int>q;
int n,L;
int child[110][6],fail[110];
bool tag[110];
void Insert(int S[],int id)
{
int now=0;
for(int i=1;i<=L;++i)
{
if(!child[now][S[i]-1])
child[now][S[i]-1]=size++;
now=child[now][S[i]-1];
}
tag[now]=1;
ma[id]=now;
}
void build()
{
fail[0]=-1;
q.push(0);
while(!q.empty())
{
int U=q.front(); q.pop();
for(int i=0;i<6;++i)
if(child[U][i])
{
int V=fail[U];
while(V!=-1)
{
if(child[V][i])
{
fail[child[U][i]]=child[V][i];
break;
}
V=fail[V];
}
if(V==-1)
fail[child[U][i]]=0;
if(tag[fail[child[U][i]]])
tag[child[U][i]]=1;
q.push(child[U][i]);
}
else if(U)
child[U][i]=child[fail[U]][i];
}
}
void Init()
{
memset(child,0,sizeof(child));
memset(fail,0,sizeof(fail));
memset(tag,0,sizeof(tag));
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(x,0,sizeof(x));
memset(b,0,sizeof(b));
size=1;
}
int T;
int main()
{
// freopen("hdu5955.in","r",stdin);
int s[13];
scanf("%d",&T);
for(;T;--T)
{
Init();
scanf("%d%d",&n,&L);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=L;++j)
scanf("%d",&s[j]);
Insert(s,i);
}
build();
for(int i=0;i<size;++i)
{
if(!tag[i])
for(int j=0;j<6;++j)
A[child[i][j]+1][i+1]+=1.0/6.0;
A[i+1][i+1]-=1.0;
}
b[1]=-1.0;
guass_jordan();
for(int i=1;i<n;++i)
printf("%.6lf ",x[ma[i]+1]);
printf("%.6lf\n",x[ma[n]+1]);
}
return 0;
}

【AC自动机】【高斯消元】hdu5955 Guessing the Dice Roll的更多相关文章

  1. hdu 5955 Guessing the Dice Roll 【AC自动机+高斯消元】

    hdu 5955 Guessing the Dice Roll [AC自动机+高斯消元] 题意:给出 n≤10 个长为 L≤10 的串,每次丢一个骰子,先出现的串赢,问获胜概率. 题解:裸的AC自动机 ...

  2. UVALive - 3490 Generator (AC自动机+高斯消元dp)

    初始有一个空串s,从前n个大写字母中不断随机取出一个字母添加到s的结尾,出现模式串t时停止,求停止时s的长度期望. 这道题解法不唯一,比较无脑的方法是对模式串t建一个单串AC自动机,设u为自动机上的一 ...

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

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

  4. hdu5955 Guessing the Dice Roll【AC自动机】【高斯消元】【概率】

    含高斯消元模板 2016沈阳区域赛http://acm.hdu.edu.cn/showproblem.php?pid=5955 Guessing the Dice Roll Time Limit: 2 ...

  5. [HDU5955]Guessing the Dice Roll

    Problem Description There are N players playing a guessing game. Each player guesses a sequence cons ...

  6. 【HDU5955】Guessing the Dice Roll/马尔科夫

    先从阿里机器学习算法岗网络笔试题说起:甲乙两人进行一个猜硬币的游戏.每个人有一个目标序列,由裁判来抛硬币.谁先得到裁判抛出的一串连续结果,谁赢. 甲的目标序列是正正正,乙的目标序列是反正正.那么如果裁 ...

  7. 2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac ...

  8. 【HDOJ5955】Guessing the Dice Roll(概率DP,AC自动机,高斯消元)

    题意: 有n个人,每个人有一个长为L的由1~6组成的数串,现在扔一个骰子,依次记录扔出的数字,如果当前扔出的最后L个数字与某个人的数串匹配,那么这个人就算获胜,现在问每个人获胜的概率是多少. n,l& ...

  9. BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)

    BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...

随机推荐

  1. 解决echarts中X轴文字过长的问题。【转】

    axisLabel: { interval: , formatter:function(value) { debugger var ret = "";//拼接加\n返回的类目项 ; ...

  2. 工作总结-js插件

    因最近工作需要,使用了一些js插件,感觉还不错,记录下来以便以后使用. 1.图片轮播插件: 扩展:梦想天空系列:http://www.cnblogs.com/lhb25/archive/2013/01 ...

  3. 使用MAT分析内存泄露

    使用MAT分析内存泄露 对于大型服务端应用程序来说,有些内存泄露问题很难在测试阶段发现,此时就需要分析JVM Heap Dump文件来找出问题.随着单机内存越来越大,应用heap也开得越来越大,动辄十 ...

  4. sql异常-The used SELECT statements have a different number of columns

    两个或多个select查询进行union时,查询的列不对应.两个select进行union时,两个select的查询出的列必须相对应.

  5. 关于跨域策略文件crossdomain.xml文件--配置实例

    转载自:http://bbs.phpchina.com/blog-52440-191623.html 我一直不太明白crossdomain.xml文件是干嘛用的,今天总算比较清楚的知道了一下. 这是F ...

  6. jw player学习笔记

    一.是否支持IE7/8 本地离线播放不支持IE7/8,部署在服务器上时可以. 本地播放报错示意图 二.如何去Logo 1.网页版--HTML5---破解 桌面浏览器看到的效果: jwplayer(&q ...

  7. 2017年上海金马五校程序设计竞赛:Problem A : STEED Cards (STL全排列函数)

    Description Corn does not participate the STEED contest, but he is interested in the word "STEE ...

  8. bzoj 1061 志愿者招募 费用流

    详见BYV的博客,写的非常全面https://www.byvoid.com/blog/noi-2008-employee /************************************** ...

  9. bzoj 1192 二进制

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1192 继续刷水题,二进制思想 //By BLADEVIL var x :longint; ...

  10. html——零散知识点

    1.form表单中的button  form表单中,正常应该提交数据的是type="submit"   2. html5的文件读取方法FileReader()     3.inpu ...