SDOI2017 硬幣遊戲 Hash 高斯消元

2021-09-12 04:00:19 字數 2192 閱讀 3245

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

81​ps​

=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 一下,大力合併就好了,合併直接對位相乘,只需要在...