這個題是一道ac自動機上的概率dp,可以幫助理解一下ac自動機的結構。
首先我們把所有的串插入trie,建立ac自動機,求一下轉移函式(相當於構造乙個trie圖),那麼就可以概率dp了。首先到達每個點的概率為變數,然後我們要求的就是到達接受狀態(也就是每個串的結尾對應的狀態)的概率。注意到了接受狀態就不必往下轉移了,因為遊戲就此結束了。注意有乙個限制是必須要加的,就是所有接受狀態的概率和是1。如果不加的話,會得到所有點的概率等於0這個答案。那麼我們就隨便拿乙個方程替換這個方程就好了。
1 #include2 #include3 #include4 #include5 #include6game#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 }
其實直接把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...