給出n個單詞,再給出一段包含m個字符的文章,找出有多少個單詞在文章里出現過。
1、對n個單詞構造字典樹。
2、構造失敗指針。
設當前節點為X,失敗指針指向Y。
1。若當前節點X沒有兒子t,則X的兒子t等價於Y的兒子t。
2。若當前節點X有兒子t,t的失敗指針指向Y的兒子t。
Y與X有最長公共后綴。
3、模式匹配。
沿着next指針遍歷。
例:4個單詞:0101、1011、1100、0010。在構造完失敗指針后,順便完善next指針,使得匹配時只需沿着next指針遍歷,匹配時沿着fail指針遍歷是為了統計出當前串包含的子串。
模板題:
【ZOJ】3430 Detect the Virus (用int存char)
【ZOJ】3228 Searching the String
矩陣:
把自動機上可行的路徑構造出矩陣,對矩陣n次方后,mat[i][j]的值就是從i到j走n步的路徑數。
DP:
題意:給出病毒串,求長度為n且不含病毒串的DNA種數。
dp[i][j]表示長度為i時,以自動機上結點編號為j結尾的種數。dp[i][j]+=dp[i-1][k],k是自動機上能轉移到j的結點,且j、k都不是病毒串的結尾。(dp[0][0]=1)
題意:給出字符串(<10),求至少由x個字符串組成的長度為n的字符串種數。
dp[i][j][k]表示長度為i時,以自動機上結點編號為j結尾,把用到的串二進制壓縮為k的種數。dp[i][j][k]+=dp[i-1][p][t],p是自動機上能轉移到j的結點。(dp[0][0][0]=1)
題意:給出病毒串(<50),求最少的修改次數,使得DNA串不含病毒串。
dp[i][j]表示長度為i時,以自動機上結點編號為j結尾,使得該DNA串不含病毒串的最小修改次數。每次轉移枚舉是否需要修改,以及需要修改的字符。
題意:給出n個字符串,以及每個字符串的權值,求權值最大,字符串長度不超過m,最短且字典序最小的字符串。
dp[i][j]表示長度為i時,以自動機上結點編號為j結尾,能構造的最大權值。dp[i][j]=max(dp[i-1][k]+cost[j])。
題意:給出n個DNA(n<50),以及一個字符串s,求s的一個排列,使其包含最多的DNA串。
對A,C,G,T哈希成一個狀態,dp[i][j]表示狀態為i,當前s的最后一個DNA為第j個所包含的DNA個數。
題意:有n(<10)個01串以及m(<1000)個病毒串,將01串拼接成最短的且不含病毒串。
將01串和病毒串一起構造自動機,枚舉每個01串的結尾廣搜,可以得到該串和其他01串結尾的最短距離。
對n個01串二進制壓縮,dp[i][j]表示狀態為i,最后拼接上的01串是第j個。
題意:給出n(<100)個長度(<20)的01病毒串,求A~B的BCD編碼中,不含病毒串的個數。0 < A ≤ B < 10200。
先預處理出自動機中每個結點,往0~9轉移的后繼結點。
數位DP,用DFS實現。
DFS(int rt,int pos,bool bound,bool zero)表示當前自動機的位置在rt,數字A或B枚舉到第pos位,是否有邊界限制,是否存在前導零。