【總結】AC自動機


給出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指針遍歷是為了統計出當前串包含的子串。

 

模板題:

【HDU】2222 Keywords Search

【HDU】2896 病毒侵襲

【HDU】3065 病毒侵襲持續中

【ZOJ】3430 Detect the Virus (用int存char)

【ZOJ】3228 Searching the String

 

矩陣:

把自動機上可行的路徑構造出矩陣,對矩陣n次方后,mat[i][j]的值就是從i到j走n步的路徑數。

【POJ】2778 DNA Sequence

【HDU】2243 考研路茫茫――單詞情結

 

DP:

【POJ】1625 Censored!

題意:給出病毒串,求長度為n且不含病毒串的DNA種數。

dp[i][j]表示長度為i時,以自動機上結點編號為j結尾的種數。dp[i][j]+=dp[i-1][k],k是自動機上能轉移到j的結點,且j、k都不是病毒串的結尾。(dp[0][0]=1)

 

 

【HDU】2825 Wireless Password

題意:給出字符串(<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)

 

【HDU】2457 DNA repair

題意:給出病毒串(<50),求最少的修改次數,使得DNA串不含病毒串。

dp[i][j]表示長度為i時,以自動機上結點編號為j結尾,使得該DNA串不含病毒串的最小修改次數。每次轉移枚舉是否需要修改,以及需要修改的字符。

 

【HDU】2296 Ring

題意:給出n個字符串,以及每個字符串的權值,求權值最大,字符串長度不超過m,最短且字典序最小的字符串。

dp[i][j]表示長度為i時,以自動機上結點編號為j結尾能構造的最大權值。dp[i][j]=max(dp[i-1][k]+cost[j])。

 

【HDU】3341 Lost's revenge

題意:給出n個DNA(n<50),以及一個字符串s,求s的一個排列,使其包含最多的DNA串。

對A,C,G,T哈希成一個狀態,dp[i][j]表示狀態為i,當前s的最后一個DNA為第j個所包含的DNA個數。

 

【HDU】3247 Resource Archiver

題意:有n(<10)個01串以及m(<1000)個病毒串,將01串拼接成最短的且不含病毒串。

將01串和病毒串一起構造自動機,枚舉每個01串的結尾廣搜,可以得到該串和其他01串結尾的最短距離。

對n個01串二進制壓縮,dp[i][j]表示狀態為i,最后拼接上的01串是第j個。

 

【ZOJ】3494 BCD Code

題意:給出n(<100)個長度(<20)的01病毒串,求A~B的BCD編碼中,不含病毒串的個數。0 < AB < 10200

先預處理出自動機中每個結點,往0~9轉移的后繼結點。

數位DP,用DFS實現。

DFS(int rt,int pos,bool bound,bool zero)表示當前自動機的位置在rt,數字A或B枚舉到第pos位,是否有邊界限制,是否存在前導零。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM