JSOI 2009 BZOJ 1444 有趣的游戲

題面

題目描述

小陽陽發明了一個有趣的游戲:有n個玩家,每一個玩家均有一個長度為 l 的字母序列,任何兩個玩家的字母序列不同。共有m種不同的字母,所有的字母序列都由這m種字母構成,為了方便,我們取大寫字母的前。個字母。例如。m =3 , l = 4 , ABAA , CBCA 為兩個合法的字母序列。現在由小陽陽來操控一臺神奇的機器,每個時刻機器會隨機產生一個字母,其中第i種字母隨機出來的概率為pi/qi,顯然 sum(pi/qi)=1 。這樣T個時刻后機器會產生一個長度為 T 的字母序列。如果某個時刻某個玩家發現自己的字母序列在機器產生的字母序列中出現了,“出現”的定義是玩家的字母序列是機器產生的字母序列中連續的一段,那么我們稱這個玩家獲勝,游戲結束。現在小陽陽感興趣的一個問題是,每個玩家分別有多大的概率能獲得這場游戲的勝利呢?

輸入格式

第一行有三個正整數n,l,m表示有n個人,每個人的字母序列長度為l,共有m個字母。
接下來m行,每行有兩個非負整數p,q,表示隨機到第i個字母的概率為p/q(0<=p<=q<=10,(p,q)=1)。數據保證m個字母的隨機概率之和為1。
接下來n行,每行有一個長度為l的字母序列,表示第i個人的字母序列。數據保證所有的字母為大寫字母的前m個且沒有兩個字母序列完全相同。

輸出格式

包含n行,每行包含一個實數,表示第i個人獲勝的概率,輸出結果四舍五入到兩位小數。

樣例輸入1

3 2 2
1 2
1 2
AB
BA
AA

樣例輸出1

0.25
0.50
0.25

樣例輸入2

3 4 2
1 2
1 2
AABA
ABAA
BAAA

樣例輸出2

0.31
0.33
0.37

樣例說明1

兩種字母 A 和 B ,概率均為 1/2。若前兩個字母為 AB , BA 或AA,均有一個人獲勝,獲勝概率為 1 / 4 ;若前兩個字母為 BB ,那么之后隨機到 BBA , BBBA , BBBB 入都一定是 BA 獲勝。因此 BA 的獲勝概率為 1/4 + 1/4 = 1/2 。

樣例說明 2

三個人的獲勝概率分別為 4/13 , 17/52 , 19/52 ,注意輸出結果四舍五入到兩位小數。、

數據范圍

100%的數據保證, n , l, m≤ 10.

題解

涉及概率 / 期望的題, 無非就是概率轉期望, 期望轉概率, DP一下就好了.
比如說這一題, 我們只需要建立trie圖, 求出每個節點的經過的期望次數即可.
注意, 當一個節點的兒子為NULL時, 應該把這個概率加到根節點上.

#include <cstdio>
#include <cstring>
#include <deque>
#include <algorithm>const int N = 10, M = 10, L = 10;
int n, l, m;
double p[M];
struct matrix
{int n;double a[N * L][N * L + 1];inline matrix(){memset(a, 0, sizeof(a));}inline void gauss(){for(int i = 0; i < n; ++ i){int p;for(p = i; p < n && a[p][i] == 0; ++ p);if(p ^ i)for(int j = 0; j <= n; ++ j)std::swap(a[i][j], a[p][j]);for(int j = 0; j < n; ++ j)if(j ^ i){double tmp = a[j][i] / a[i][i];for(int k = 0; k <= n; ++ k)a[j][k] -= a[i][k] * tmp;}}}
}A;
struct ACautomaton
{int cnt;struct node{node *suc[10], *fl;int ed, id;inline node(int _id){for(int i = 0; i < 26; ++ i)suc[i] = NULL;ed = 0;id = _id;}}*rt;inline ACautomaton(){cnt = 0;rt = new node(cnt ++);rt->fl = rt;}inline int insert(char *str, int len, int id){node *u = rt;for(int i = 0; i < len; u = u->suc[str[i] - 'A'], ++ i)if(u->suc[str[i] - 'A'] == NULL)u->suc[str[i] - 'A'] = new node(cnt ++);u->ed = 1;return u->id;}inline void build(){std::deque<node*> que;que.clear();for(int i = 0; i < 26; ++ i)if(rt->suc[i] != NULL)rt->suc[i]->fl = rt, que.push_back(rt->suc[i]), A.a[rt->suc[i]->id][0] = p[i];else if(i < m)A.a[0][0] += p[i];for(; ! que.empty(); que.pop_front()){node *u = que.front();for(int i = 0; i < 26; ++ i)if(u->suc[i] != NULL){if(! u->ed)A.a[u->suc[i]->id][u->id] = p[i];node *p = u->fl;for(; p != rt && p->suc[i] == NULL; p = p->fl);u->suc[i]->fl = p->suc[i] == NULL ? p : p->suc[i];que.push_back(u->suc[i]);}else{u->suc[i] = u->fl->suc[i];if(u->suc[i] != NULL && ! u->ed)A.a[u->suc[i]->id][u->id] = p[i];else if(i < m && ! u->ed)A.a[0][u->id] += p[i];}}A.n = cnt;A.a[0][cnt] -= 1;for(int i = 0; i < cnt; ++ i)A.a[i][i] += -1;}
}ACA;
int main()
{#ifndef ONLINE_JUDGEfreopen("BZOJ1444.in", "r", stdin);freopen("BZOJ1444.out", "w", stdout);#endifscanf("%d%d%d", &n, &l, &m);for(int i = 0; i < m; ++ i){int x, y;scanf("%d%d\n", &x, &y);p[i] = (double)x / y;}static int ed[N];for(int i = 0; i < n; ++ i){static char str[L];scanf("%s", str);ed[i] = ACA.insert(str, l, i);}ACA.build();A.gauss();for(int i = 0; i < n; ++ i)printf("%.2lf\n", A.a[ed[i]][A.n] / A.a[ed[i]][ed[i]] == 0 ? 0 : A.a[ed[i]][A.n] / A.a[ed[i]][ed[i]]);
}

轉載于:https://www.cnblogs.com/ZeonfaiHo/p/7147230.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html語言dl與ul,HTML中DL、UL、OL用哪個比較好

大家好~ 我是一枚正直純潔的苦逼程序員&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;ul&#xff0c;ol&#xff0c;dl標簽是CSS網頁布局中常用的列表元素。 列表將具有相似特征或先后順序的內容按照從上到下的順序排列起來。1.ul標簽&#xff1a;無序列表始于…

slot多作用域 vue_詳解Vue.js 作用域、slot用法(單個slot、具名slot)

作用域HEi免費資源網在介紹slot前&#xff0c;需要先知道一個概念&#xff1a;編譯的作用域。比如父組件中有如下模板&#xff1a;HEi免費資源網{{message}}這里的message就是一個slot&#xff0c;但是它綁定的是父組件的數據&#xff0c;而不是組件< child-component >的…

Java – JDK 8的遠景

世界正在緩慢但肯定地發生變化。 經過更改后&#xff0c;Java有了JDK 7的全新外觀&#xff0c;Java社區期待JDK 8&#xff08;可能還有JDK 9&#xff09;所帶來的其余改進。 JDK 8的目標目的是填補JDK 7實施中的空白-該實施中剩下的部分難題&#xff0c;應該在2013年底之前為廣…

CSS 學習路線(一)元素

元素(element) 類型:替換和非替換元素 替換元素(replaced element): 用來替換元素內容的部分并非由文檔內容直接顯示. eg:img input 非替換元素(nonreplaced element): 其內容由用戶代理在元素本身生成的框顯示. eg:絕大多數都是非替換元素 基本元素類型:塊級(block-lev…

[urllib]urlretrieve在python3

python3下面要使用&#xff1a;urllib.request.urlretrieve()這種形式的調用 1 from urllib.request import urlretrieve 2 3 4 urlretrieve(url, path) 轉載于:https://www.cnblogs.com/sigai/p/8178375.html

使用Gulp壓縮CSS/JS

一、安裝 1.安裝gulp npm install -g gulp2.檢查gulp 版本 gulp -v3.在項目文件夾下安裝gulp npm install --save-dev gulp二、壓縮JS 1.安裝gulp-uglify模塊 npm install gulp-uglify2.在項目根目錄創建gulpfile.js文件 3.在gulpfile.js文件中寫入代碼 // 獲取 gulpvar gulp …

android活動開始,android – 點擊谷歌地圖標記infoWindow開始活動

我建議使用HashMap或類似的東西.當您遍歷對象列表并為它們創建標記時,還要將標記添加到列表中,使用對象的ID作為鍵,將標記作為值&#xff1a;private HashMap markerMap new HashMap();…for(MarkerObject obj : this.markerObjects){//If the marker isnt already being disp…

Hamcrest包含匹配器

與Hamcrest 1.2相比 &#xff0c;針對Matchers類的Hamcrest 1.3 Javadoc文檔為該類的幾種方法添加了更多文檔。 例如&#xff0c;四個重載的contains方法具有更具描述性的Javadoc文檔&#xff0c;如下面所示的兩個比較屏幕快照所示。 盡管僅通過嘗試就可以弄清楚“包含”匹配器…

華為cor—al10_cor al10是華為什么型號 cor al10是華為啥型號

cor al10是華為榮耀Play。外觀方面&#xff0c;榮耀Play提供有星云紫&#xff0c;極光藍&#xff0c;幻夜黑三種基礎配色&#xff0c;以及幻夜黑與魅焰紅的酷玩版配色&#xff1b;拍照方面&#xff0c;榮耀Play具有1600萬AI雙攝像頭&#xff0c;前置攝像頭為1600萬像素&#xf…

函數 (四) 迭代器和生成器

一 迭代器 一 迭代的概念 #迭代器即迭代的工具&#xff0c;那什么是迭代呢&#xff1f;#迭代是一個重復的過程&#xff0c;每次重復即一次迭代&#xff0c;并且每次迭代的結果都是下一次迭代的初始值 while True: #只是單純地重復&#xff0c;因而不是迭代print(>) l[1,2,3]…

進階-JMS 知識梳理

JMS 一、 概述與介紹 ActiveMQ 是Apache出品&#xff0c;最流行的、功能強大的即時通訊和集成模式的開源服務器。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現。提供客戶端支持跨語言和協議&#xff0c;帶有易于在充分支持JMS 1.1和1.4使用J2EE企業集成模式…

android藍牙pair,Android向更多藍牙設備開放Fast Pair功能 配對更輕松了

原標題&#xff1a;Android向更多藍牙設備開放Fast Pair功能 配對更輕松了 來源&#xff1a;cnBeta.COM藍牙是一項應用非常廣泛的無線技術&#xff0c;在無線音頻配件、智能手表和智能家電中都廣泛使用。不過藍牙設備的配對體驗并不優秀&#xff0c;而且無法實現跨平臺的一致性…

用CSS讓DIV上下左右居中的方法

例如 一個父div(w:100%;h:400px)中有一個子div(w:100px;100px;)。讓其上下左右居中。 方法一&#xff08;varticle-align&#xff09; 理念 利用表格單元格的居中屬性。 步驟 父div外層配置一個div&#xff0c;同時設置為表格元素 (display: table)&#xff0c;寬度為100%父…

功能性Java集合

如今&#xff0c;在功能上大肆宣傳&#xff0c;因此至少在Java集合方面&#xff0c;我將簡要介紹一下其中的功能。 我個人喜歡標準 集合API&#xff0c;但在某些情況下可能會很尷尬并添加其他詳細信息。 在Java 8的更高版本中&#xff0c;這應該不是問題。 在那里&#xff0c;…

python繪制帕累托圖

python繪制帕累托圖代碼 1 import pandas as pd2 import matplotlib.pyplot as plt3 plt.rcParams[font.sans-serif][SimHei]#表示可以顯示中文4 plt.rcParams[axes.unicode_minus]False#表示可以正常顯示正負號5 datapd.read_csv(catering_dish_profit.csv,index_coltype)6 pr…

currentStyle、getComputedStyle 獲取樣式

style.height 獲取的是行間的樣式 currentStyle.height、getComputedStyle(elem,null).height 獲取的是 div 的 content 的寬高&#xff0c; clientHeight 獲取的是 contentpadding&#xff0c; offsetHeight 獲取的是contentpaddingborder。 <script> window.onload…

html5 測評游戲,暗黑之王評測:HTML5游戲鑄就最華麗ARPG冒險

由白鷺時代(Egret Technology)與比悅科技聯手推出的重度大型HTML5游戲《暗黑之王》&#xff0c;一款典型的ARPG手游&#xff0c;其HTML5版本推出以來&#xff0c;獲得了來自業界、玩家和媒體的大量關注。其豐富的游戲內容和玩法&#xff0c;加上卓越的游戲性能表現&#xff0c;…

搞定flex布局

這幾種方式的搭配使用可以輕松搞定 PC 端頁面的常見需求&#xff0c;比如實現水平居中可以使用 margin: 0 auto&#xff0c;實現水平垂直同時居中可以如下設置&#xff1a;.dad {position: relative; } .son {position: absolute;margin: auto;top: 0;right: 0;bottom: 0;left…

Java基礎5一數組的常見應用算法

常用算法 1.冒泡排序: 原理&#xff1a;比較兩個相鄰的元素&#xff0c;將值大的元素交換至右端 示例: public static void bubbleSort(int[] a) {int n a.length;//總共進行n-1輪的比較for (int i 1; i < n; i) {for (int j 0; j < n - i; j) {if (a[j] > a[j 1]…

使用Xtend構建Vaadin UI

今天&#xff0c;我決定向Xtend打個招呼。 我希望學習一些新的編程語言。 選擇一個標準的清單并不多。 它必須是在JVM上運行的編程語言&#xff0c; 如果我不需要學習用于建筑應用的全新生態系統&#xff0c;那就太好了。 我已經檢查了幾個選項。 JVM的編程語言列表已不多了…