题意
有 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. longjmp setjmp and volatile

    /******************************************************************************* * 版权所有: * 模 块 名: * ...

  2. Loadrunner11安装和破解方法

    公司很多项目都在做性能测试,打算把性能测试学习下.(不懂还可以问问公司大神,这么好的机会不要错过了O(∩_∩)O哈哈~)用了二周实践看了性能测试方面一些基本术语和概念,一直都还没自己动手实践,光看基本 ...

  3. 利用netperf、iperf、mtr测试网络

    1.netperf安装和使用 netperf安装 # tar -xzvf netperf-.tar.gz # cd netperf- # ./configure # make # make insta ...

  4. WebService 生成类的命令语句

    在开发项目中,有时候需要调用webservice接口程序,根据项目规定有的项目是直接引入接口,有的是需要把接口生成代理类的形式在项目中使用,根据项目需要来取舍. 以下列出项目中常用的Webservic ...

  5. 访问本地Access 数据出错

    访问本地的access数据库时,出现了OleDbException 10Aug2015 晚: 好像找到了问题所在, 虽然不知道背后深层次的原因 改用了C#, 然后command 语句里也update了 ...

  6. X3850M2安装CertOS 7 KVM 2--Mount

    x3850 m2设备接的存储是DS8000,检查发现系统下有两块disk是IBM2107900,一块容量为215GB,另一块是4GB.原因简单,4GB是以前高可用群集时用来做仲裁盘的. 奇怪的是,每块 ...

  7. Android中的onActivityResult和setResult方法的使用

    如果你想在Activity中得到新打开Activity关闭后返回的数据,你需要使用系统提供的startActivityForResult(Intent intent,int requestCode)方 ...

  8. 把crosswalk打包到cordova项目中

    (1)从Crosswalk官网下载Cordova Android (ARM) 点击下载 (2)解压压缩包到任意目录 (3)创建工程 cordova工程 cordova create Crosswalk ...

  9. C# 3D效果饼状图的绘制

    第一步:放置图表控件 拖动工具栏的Chart控件到界面上 然后选中控件,设置Series属性,将ChartType属性改为pie 第三步:设置3D效果 选择控件,设置ChartArea属性,如下 设置 ...

  10. hdu1004

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...