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

题意:给出 n≤10 个长为 L≤10 的串,每次丢一个骰子,先出现的串赢,问获胜概率。

题解:裸的AC自动机,求匹配到终止结点的概率,用 高斯消元?一开始不知道怎么建方程组,直接举个例子吧:

Input:

1

2 2

1 1

2 1

图解:

x0原本概率就是1,然后还要加上其他结点走向它的概率,,这样最后算下来是大于1的,现在还是觉得怪怪的。。。

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
const int N = ;
const int M = ;
int equ, var;
double a[N][N];
double x[N];
void Gauss() {
int i, j, k;
int max_r;
int col;
for(col = , k = ; k < equ && col < var; ++k, ++col) {
max_r = k;
for(i = k+; i < equ; ++i)
if(fabs(a[i][col]) > fabs(a[max_r][col]))
max_r = i;
if(max_r != k) {
for(j = k; j < var; ++j)
swap(a[k][j], a[max_r][j]);
swap(x[k], x[max_r]);
}
x[k] /= a[k][col];
for(j = col+; j < var; ++j)
a[k][j] /= a[k][col];
a[k][col] = ;
for(i = ; i < equ; ++i) {
if(i != k) {
x[i] -= x[k] * a[i][col];
for(j = col+; j < var; ++j)
a[i][j] -= a[k][j] * a[i][col];
a[i][col] = ;
}
}
}
}
int mk[N];
struct Trie {
int next[N][M], fail[N], tag[N];
int root, L;
int newnode() {
for(int i = ;i < M;i++)
next[L][i] = -;
tag[L++] = ;
return L-;
}
void init() { L = ; root = newnode(); }
void Insert(int buf[], int len, int id) {
int u = root;
for(int i = ; i < len; i++) {
if(next[u][buf[i]] == -)
next[u][buf[i]] = newnode();
u = next[u][buf[i]];
}
tag[u] = ;
mk[id] = u;
}
void build() {
queue<int> Q;
fail[root] = root;
for(int i = ; i < M; i++) {
if(next[root][i] == -)
next[root][i] = root;
else {
fail[next[root][i]] = root;
Q.push(next[root][i]);
}
}
while( !Q.empty() ) {
int u = Q.front();
Q.pop();
for(int i = ; i < M; i++) {
int &v = next[u][i];
if(v == -)
v = next[fail[u]][i];
else {
Q.push(v);
fail[v] = next[fail[u]][i];
}
}
}
}
void query(int n) {
int i , j;
CLR(a, ); CLR(x, );
equ = var = L;
for(i = ; i < L; ++i) a[i][i] = -1.0;
x[] = -1.0;
for(i = ; i < L; ++i) {
for(j = ; j < M; ++j) {
if(next[i][j] != - && tag[i]==)
a[next[i][j]][i] += 1.0/;
}
}
Gauss();
for(i = ; i < n-; ++i)
printf("%.6f ", x[mk[i]]);
printf("%.6f\n", x[mk[n-]]);
}
};
Trie ac;
int main() {
int T, n, m;
int A[];
scanf("%d",&T);
while( T-- ) {
scanf("%d%d", &n, &m);
ac.init();
for(int i = ; i < n; i++) {
for(int j = ; j < m; ++j) {
scanf("%d", &A[j]);
A[j]--; //0~5
}
ac.Insert(A, m, i);
}
ac.build();
ac.query(n);
}
return ;
}

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

  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. 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. HDU 2262 Where is the canteen 期望dp+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...

  5. HDU 5966 Guessing the Dice Roll

    题意有 N≤10 个人,每个猜一个长度为L≤10的由1−6构成的序列,保证序列两两不同.不断地掷骰子,直到后缀与某人的序列匹配,则对应的人获胜.求每个人获胜的概率. 思路:建立trie图,跑高斯消元. ...

  6. 【HDU 3949】 XOR (线性基,高斯消元)

    XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. hdu 5833 Zhu and 772002 异或方程组高斯消元

    ccpc网赛卡住的一道题 蓝书上的原题 但是当时没看过蓝书 今天又找出来看看 其实也不是特别懂 但比以前是了解了一点了 主要还是要想到构造异或方程组 异或方程组的消元只需要xor就好搞了 数学真的是硬 ...

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

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

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

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

随机推荐

  1. Ubuntu apache

    Linux系统为Ubuntu 1. 启动apache服务 # /etc/init.d/apache2 start 2. 重启apache服务 # /etc/init.d/apache2 restart ...

  2. NMAP - A Stealth Port Scanner--reference

    http://nmap.org/bennieston-tutorial/ 实例:nmap -sP 192.168.21.* Contents 1  Introduction Nmap is a fre ...

  3. 使用 Qt 获取 UDP 数据并显示成图片(2)

    本文首发于 BriFuture 的 个人博客 在我的前一篇文章 使用 Qt 获取 UDP 数据并显示成图片 中,我讲了如何用 Python 模拟发送数据,如何在 Qt 中高效的接收 UDP 数据包并将 ...

  4. SpringBoot | 第三十六章:集成多CacheManager

    前言 今天有网友咨询了一个问题:如何在一个工程中使用多种缓存进行差异化缓存,即实现多个cacheManager灵活切换.原来没有遇见这种场景,今天下班抽空试了下,以下就把如何实现的简单记录下. 一点知 ...

  5. Go在windows10 64位上安装

    一.安装 1.下载安装包http://www.golangtc.com/download,这是国内的地址,也直接去官网下载. 2.选择适合自己的版本,这里我选择安64位装版go1.9.2.window ...

  6. show_space1

    CREATE OR REPLACE PROCEDURE show_space1(p_segname IN VARCHAR2, p_owner IN VARCHAR2 DEFAULT 'NTSUSER0 ...

  7. moment常用操作

    1.返回当前日期截止时的时间戳: post.createtime = moment().unix(); let stime = moment(moment.unix(moment().unix()). ...

  8. GuavaCache实现堆缓存

    一.缓存 频繁地数据库I/O是很大的负担,而缓存是减少I/O提高性能的银弹. 缓存的实现一般上是以类似map的键值对的形式,并对外提供put和get方法,但缓存空间不能无限扩大,所以它得有一种缓存清除 ...

  9. Collatz 序列、逗号代码、字符图网格

    1.collatz序列 编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数, 那么 collatz()就打印出 number // 2,并返回该值.如果 num ...

  10. Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了“HyperLogLog”,从而引出了Card ...