description
給你乙個字串集,構造乙個串每個位置等概率的插入。
問字串集中每個字串最先出現在構造的串中的概率。
sample input
3 3tht
tthhtt
sample output
0.3333333333
0.2500000000
0.4166666667
首先這道題有弱化版,就是jso
i2009奇怪
的遊
戲jsoi2009奇怪的遊戲
jsoi20
09奇怪
的遊戲。
但是直接暴力高消不是很行。
考慮更為巧妙地優化狀態。
我們設乙個未匹配任何串的狀態為s
ss,它的概率為p
sp_s
ps。
乙個串i
ii匹配成功的概率為p
ip_i
pi。
假設有乙個串a=h
tt,b
=tth
a=htt,b=tth
a=htt,
b=tt
h,但是s
ss不一定是加入了tth
tthtt
h之後才滿足了匹配。他有可能有
s bsb
sb或s ′+
a+
hs'+a+h
s′+a+h
或者s ′′
+a+t
hs''+a+th
s′′+a+
th這種形式,也就是說可以列出這種方程:
1 8p
s=p1
+34p
2\frac 18p_s=p_1+\frac 34p_2
81ps
=p1
+43
p2。
那麼只用暴力判乙個串的字首是不是另乙個串的字尾,然後列方程即可。
方程數為n+1
n+1n+
1個,那麼就直接爆解方程組即可。
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
int_max
(int x,
int y)
int_min
(int x,
int y)
const
int n =
302;
const ull p =
131;
intread()
while
(ch >=
'0'&& ch <=
'9') s = s *
10+ ch -
'0', ch =
getchar()
;return s * f;
}void
put(
int x)
char ss[n]
;ull s[n]
[n], o[n]
;double po[n]
, f[n]
[n];
void
gauss
(int n)
}for
(int i = n; i >=
1; i--)}
}int
main()
for(
int i =
1; i <= n; i++)}
}}for(
int i =
1; i <= n; i++
) f[i]
[n +1]
-= po[m]
, f[n +1]
[i]=
1.0; f[n +1]
[n +2]
=1.0
;gauss
(n +1)
;for
(int i =
1; i <= n; i++
)return0;
}
SDOI2017 硬幣遊戲
考慮生成函式來做 g x 函式就是0 0 x 1 x s n s x n 就是最後s位必須填這個串,但是前面隨便填的方案數 然後列舉之前出現了哪個串 包括自己 如果沒有相交,就是fj x g x 還有就是有前字尾有相交部分,pji x 中的第k位,表示i的長度為m k的字首和j的長度為m k的字尾是...
SDOI2017硬幣遊戲
洛咕神題,幸好我不是sd的qaq。假設你們都會 o n 3m 3 的高斯消元,具體來說就是建出 trie 圖然後套遊走的板子。然後我們發現可以把不能匹配任何串的概率壓到一起。考慮乙個不能匹配任何串的 s 乙個串 a i 獲勝當且僅當最後串是這樣的 s a i 真的嗎?如果 s 的字尾和 a i 的字...
SDOI2017 切樹遊戲
題目 二輪毒瘤題啊 辣雞洛谷竟然有卡樹剖的資料 還是 loj 可愛 首先這道題沒有帶修,設 dp 表示以 i 為最高點的連通塊有多少個異或和為 j g sum dp k in tree i 表示 k 在 i 子樹內部 我們可以直接把每乙個權值 fwt 一下,大力合併就好了,合併直接對位相乘,只需要在...