题意
有 N≤10 个人,每个猜一个长度为L≤10的由1−6构成的序列,保证序列两两不同。
不断地掷骰子,直到后缀与某人的序列匹配,则对应的人获胜。
求每个人获胜的概率。

思路:
建立trie图,跑高斯消元.
高斯消元每个点的意义是:
第i行第j列的值为x 有概率x从点j转移过来

 const double eps = 1e-;
const int SIGMA_SIZE = ;
const int MAXNODE = ; int ch[MAXNODE][SIGMA_SIZE];
int f[MAXNODE];
int sz; void insert(int* P, int len, int v) {
int u = ;
for (int i = ; i < len; i++) {
int c = P[i];
if (!ch[u][c]) {
memset(ch[sz], , sizeof(ch[sz]));
ch[u][c] = sz++;
}
u = ch[u][c];
}
} void getFail() {
f[] = ;
queue<int> q;
for (int c = ; c < SIGMA_SIZE; c++) {
int u = ch[][c];
if (u) {
q.push(u);
f[u] = ;
}
}
while (!q.empty()) {
int r = q.front(); q.pop();
for (int c = ; c < SIGMA_SIZE; c++) {
int u = ch[r][c];
if (!u) {
ch[r][c] = ch[f[r]][c];
continue;
}
q.push(u);
int v = f[r];
while (v && !ch[v][c]) v = f[v];
f[u] = ch[v][c];
}
}
} //double的高斯消元
double a[MAXNODE][MAXNODE], x[MAXNODE];//方程的左边的矩阵和等式右边的值,求解之后x存的就是结果
int equ, var;//方程数和未知数个数
int Gauss()
{
for (int k=, col=; k<equ && col<var; k++, col++)
{
int max_r=k;
for (int i=k+; i<equ; i++)
if (fabs(a[i][col]) > fabs(a[max_r][col])) max_r=i;
if (fabs(a[max_r][col]) < eps) return ;
if (k != max_r)
{
for (int j = col; j < var; j++) swap(a[k][j], a[max_r][j]);
swap(x[k], x[max_r]);
}
x[k] /= a[k][col];
for (int j=col+; j<var; j++) a[k][j] /= a[k][col];
a[k][col] = ;
for (int i=; i<equ; i++)
if (i != k)
{
x[i] -= x[k] * a[i][k];
for(int j=col+; j<var; j++) a[i][j]-=a[k][j]*a[i][col];
a[i][col] = ;
}
}
return ;
} const int maxn = ;
int n, len;
int peo[maxn][maxn];
bool end[MAXNODE];
vector<int> G[MAXNODE]; void init()
{
memset(f, , sizeof(f));
memset(ch, , sizeof(ch));
memset(a, , sizeof(a));
memset(end, , sizeof(end));
memset(x, , sizeof(x)); sz = ;
scanf("%d%d", &n, &len);
for (int i = ; i <= n; i++)
{
for (int j = ; j < len; j++)
{
scanf("%d", &peo[i][j]);
}
insert(peo[i], len, i);
end[sz - ] = true;
}
for (int i = ; i < sz; i++)
{
G[i].clear();
}
} void getGraph()
{
getFail();
for (int i = ; i < sz; i++)
{
if (!end[i])
{
for (int j = ; j < ; j++)
{
int t = ch[i][j];
G[t].push_back(i);
}
}
}
} void solve()
{
getGraph();
equ = var = sz;
for (int i = ; i <sz; i++)
{
for (auto j : G[i])
{
a[i][j] += 1.0/;
}
a[i][i] -= ;
}
x[] = -; Gauss(); vector<double> ans;
for (int i = ; i < sz; i++)
{
if (end[i])
{
ans.push_back(x[i]);
}
}
for (int i = ; i < ans.size() - ; i++)
{
printf("%.6f ", ans[i]);
}
printf("%.6f\n", *ans.rbegin()); } int main()
{
int T;
scanf("%d", &T);
while (T--)
{
init();
solve();
}
return ;
}

HDU 5966 Guessing the Dice Roll的更多相关文章

  1. HDU 5955 Guessing the Dice Roll

    HDU 5955 Guessing the Dice Roll 2016 ACM/ICPC 亚洲区沈阳站 题意 有\(N\le 10\)个人,每个猜一个长度为\(L \le 10\)的由\(1-6\) ...

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

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

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

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

  4. 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 ...

  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. 【AC自动机】【高斯消元】hdu5955 Guessing the Dice Roll

    http://blog.csdn.net/viphong/article/details/53098489 我有一点不是很懂,这样算出来转移到AC自动机根节点的概率是一个远大于1的数. 按我的理解,因 ...

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

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

  9. hdu 4586 Play the Dice 概率推导题

    A - Play the DiceTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...

随机推荐

  1. JavaScript数据类型

    当说到JavaScript的数据类型时,好多做了很多年web的朋友甚至还不太清楚.这应该算是最基础的js知识了.我觉得有必要在这记录一下,方便自己和大家查看. 最基本的,js有五种数据类型:undef ...

  2. windows下安装rabbitmq的php扩展amqp

    最近研究rabbitmq队列,linux安装这样的软件一向都是很方便的,但是windows可能会比较麻烦,所以对windows的安装做个记录. windows上使用的php扩展为dll文件,首先去下载 ...

  3. 《嫌疑人X的献身》书评

    <嫌疑人X的献身>是日本著名推理小说作家东野圭吾的代表作之一.1985年东野圭吾以一本<放学后>出道,出道初期善于写精巧细致的本格推理,后期文笔愈发老辣.简练.2005年东野圭 ...

  4. SAP IDOC开发(转)

    创建IDOC:   第一步:WE31 创建IDOC所包含的字段.   第二步:WE30 创建IDOC 把Segment分配给IDOC第三步:WE81 创建信息类型第四步:WE82 把IDOC类型与信息 ...

  5. alpha值的问题

    但凡图像都会涉及到透明度问题.使用透明度之后就可以看到多层图像.Alpha值就是用于描述透明度的参量.Alpha值是一个百分数,alpha=1表示源文件发出的光全部被观察者观察到. 既然是透明度,那么 ...

  6. SQL注入的常用函数和语句

    1.系统函数 version()   Mysql版本user()   数据库用户名database()    数据库名@@datadir   数据库路径@@version_compile_os   操 ...

  7. [转] 添加新的系统调用 _syscall0(int, mysyscall)

    实验目的阅读 Linux 内核源代码,通过添加一个简单的系统调用实验,进一步理解Linux操作系统处理系统调用的统一流程.通过用kernel module的方法来实现一个系统调用实验,进一步理解Lin ...

  8. 转的: 重绘ListView 修改标题颜色

    1.owerDraw 设置为true 2.实现事件 DrawColumnHeader DrawItem DrawSubItem private void listView1_DrawColumnHea ...

  9. Git 的详细使用

      本文翻译自Understanding Git Source Control in Xcode (译者myShire)欢迎您加入我们的翻译小组. 在应用程序开发过程中,很重要的一部分工作就是如何进行 ...

  10. android view : 绘制

    说到绘制,其实就是如何把一个view的对象,变成手机上可视的图形.很多人总结3个过程:测量,布局,绘制.这也是所有的要显示图形的程序所应该抽象的3个步骤,测量就是测量出你view的大小,布局就是要显示 ...