magic land
上的人們總是提起那個傳說:他們的祖先
john
在那個東方島嶼幫助
koishi
與其姐姐
satori
最終戰平。而後,
koishi
恢復了讀心的能力……
如今,在
john
已經成為傳說的時代,再次造訪那座島嶼的人們卻發現
koishi
遇到了新麻煩。
這次她遇到了
flandre scarlet
——她擁有可以使用禁忌魔法而不會受到傷害的能力。
為了說明什麼是禁忌魔法及其傷害,引入以下概念:
1.字母集
a上的每個非空字串對應了乙個魔法。其中a
是包含了前
alphabet
個小寫字母的集合。
2.有乙個集合
t,包含了
n個字母集
a上的字串
t中的每一串稱為乙個禁忌串(
taboo string)3.
乙個魔法,或等價地,其對應的串
s因為包含禁忌而對使用者造成的傷害按以下方式確定:把s
分割成若干段,考慮其中是禁忌串的段
的數目,不同的分割可能會有不同的數目,其最大值
就是這個傷害。
由於擁有了讀心的能力,
koishi
總是隨機地使用
flandre scarlet
的魔法,可以確定的是,她的魔法正好對應字母集
a上所有長度為
len的串
。但是,
flandre scarlet
所使用的一些魔法是帶有禁忌的,由於其自身特性,她可以使用禁忌魔法而不受到傷害,而
koishi
就不同了。可憐的
koishi
每一次使用對方的魔法都面臨著受到禁忌傷害的威脅。
你現在需要計算的是如果
koishi
使用對方的每乙個魔法的概率是均等
的,那麼每一次隨機使用魔法所受到的禁忌傷害的期望值
是多少。
第一行包含三個正整數n、
len、
alphabet
。接下來
n行,每行包含乙個串
ti,表示禁忌串。
乙個非負實數,表示所受到禁忌傷害的期望值。
2 4 2aaabb
0.75【樣例1解釋】一共有2^4 = 16種不同的魔法。需要注意的是「aabb」的禁忌傷害是1而不是2。
因為不讓在hzoj 上交,那就補一篇部落格吧haha..
首先用ac自動機的fail指標把trie圖建出來,方便轉移,然後題目讓求得實際上就是在a
c自動機上走len步走到禁忌串的期望傷害.
然而因為禁忌串比較多,無法統計方案,可以新加乙個超級節點,把每乙個禁忌串節點連向
這個超級節點,權值為1/alphabet
如果這個節點不是禁忌節點的話就列舉下一步的位置,權值為1/alphabet這樣就構造出來了矩陣,快速冪一下就行了
卡 double 差評
#include #include #include #include using namespace std;
int n,len,alphabet,sz;
const int maxn = 150000;
const int maxn = 26;
char ch[maxn];
struct node
}*root,*q[maxn],n[maxn],*c=n;
void insert(char *s)
now -> is = 1;}
void build_ac()
else root->ch[i]=root;
while(l!=r)
else now -> ch[i] = now -> fail -> ch[i];
}}}
struct matrix};
matrix operator * (matrix a,matrix b)
matrix operator ^ (matrix a,int n)
int main()
build_ac();
matrix ans;
sz=c-n;
long double tmp = 1.0/alphabet;
for(int i=0;iis)
else ans.m[i][n[i].ch[j]-n]+=tmp;
}ans.m[sz][sz]=1;
ans=ans^len;
cout<
bzoj 2553 禁忌 AC自動機 期望DP
先考慮乙個串a如何劃分價值最大,只需要按照所有t串在a中匹配的右端點排個序貪心去選,也就是希望我在a中匹配i個禁忌串,最靠後的右端點應該盡量靠前。在ac自動機上對應為 只要走到乙個禁忌串的終止節點,就將它劃分出一段,這裡的終止節點包括那些順著fail指標能走到終止節點的點 可以設dp i j 為在a...
bzoj2553 禁忌 AC自動機 矩陣乘法
題目敘述比較煩。一句話,在字母只有前alphabet時,給定n個串,求長度為len的串包含這些n個串的個數最大值的期望值。觀察資料發現串的總長度 75,所以想到ac自動機 而len大小為10 9級別,就知道肯定是在ac自動機上的矩陣乘法,這樣大致的框架就好了。如果令a k x y 表示經過k步從狀態...
Uva11468 AC自動機 概率dp
這題把ac自動機和dp結合了下,題意就是給你一些模式串,給你選擇每個字元的概率,讓你選擇l個字元,求不出現模式串的概率。先把模式串都插入ac自動機,用乙個match陣列記錄該節點是否是單詞節點,特別注意下這裡單詞節點可能是從0節點開始,也肯能由字尾構成單詞節點,所以得加一句match i match...