bzoj1444 Jsoi2009 有趣的遊戲

2022-06-01 09:27:07 字數 1673 閱讀 1424

這個題是一道ac自動機上的概率dp,可以幫助理解一下ac自動機的結構。

首先我們把所有的串插入trie,建立ac自動機,求一下轉移函式(相當於構造乙個trie圖),那麼就可以概率dp了。首先到達每個點的概率為變數,然後我們要求的就是到達接受狀態(也就是每個串的結尾對應的狀態)的概率。注意到了接受狀態就不必往下轉移了,因為遊戲就此結束了。注意有乙個限制是必須要加的,就是所有接受狀態的概率和是1。如果不加的話,會得到所有點的概率等於0這個答案。那麼我們就隨便拿乙個方程替換這個方程就好了。

1 #include2 #include3 #include4 #include5 #include6

#define maxn 1200

7using

namespace

std;

8int ch[maxn][12],tran[maxn][12

],pre[maxn],q[maxn],v[maxn],d[maxn];

9char

s[maxn];

10double

rate[maxn],a[maxn][maxn],ans[maxn];

11int

n,m,len,num,now,rot;

1213

void insert(int

w)14

1819

void

build()

2038 q[++tail]=k;39}

40}41}

4243

void gauss(int

n)44

51if (!p) continue;52

for (int l=1;l<=n+1;l++) swap(a[p][l],a[k][l]);

53for (int j=k+1;j<=n;j++)

54if

(a[j][i])

5559 k++;60}

61for (int i=n;i;i--)

6268

}

6970

intmain()

7181 now=rot=num=1;82

for (int i=1;i<=n;i++)

8390

build();

91for (int i=1;i<=num;i++)

92for (int w=1;w<=m;w++)

9399

//求轉移函式

100for (int i=1;i<=num;i++)

101106

for (int i=1;i<=num;i++) if (v[i]) a[1][i]=1;else a[1][i]=0

;107 a[1][num+1]=1

;108

gauss(num);

109for (int i=1;i<=n;i++)

110if (ans[d[i]]>0&&ans[d[i]]<=1

)111 printf("

%.2lf\n

",ans[d[i]]);

112else printf("

0.00\n");

113return0;

114 }

game

其實直接把trie圖構出來會方便很多吧。

bzoj1444 Jsoi2009 有趣的遊戲

time limit 10 sec memory limit 64 mb submit 1007 solved 334 submit status discuss 注意 是0 p 題解 ac自動機 矩陣乘法 首先把模式串建成ac自動機,構建出轉移矩陣。構造方法 a i j 表示從第i個結點轉移到第j...

小店購物 JSOI2008 BZOJ 2260

grant是乙個個體戶老闆,他經營的小店因為其豐富的優惠方案深受附近居民的青睞,生意紅火。小店的優惠方案十分簡單有趣。grant規定 在一次消費過程中,如果您在本店購買了精製油的話,您購買香皂時就可以享受2.00元 塊的 如果您在本店購買了香皂的話,您購買可樂時就可以享受1.50元 聽的 諸如此類的...

BZOJ 4327 JSOI2012 玄武密碼

字尾自動機裸題。藉著這道裸題總結一下字尾自動機的查詢問題。1.查字首 查詢時不跳parent,遇到空節點就跳出。2.查子串 查詢時跳parent,記錄最大ans.3.查次數 lct維護right陣列 4.查不同的串的數目 在建樹時維護,乙個點對答案的貢獻為this max len this pare...