AC自動機學習筆記

2022-06-18 02:42:08 字數 1288 閱讀 3555

問題的背景

來一道題:

給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。

注意:是出現過,就是出現多次只算一次。

我們將n個模式串建成一顆字典樹。但是當我們匹配成功乙個模式串後,需要重新回到根做匹配,這樣效率太低了。

比如這個字典樹,我們從4號點匹配失敗後,可以繼續從7號點開始匹配,然後匹配到8。

那麼我們怎麼確定從哪個點開始匹配呢?我們稱i匹配失敗後從j開始匹配,j是i的失配指標。

失配指標的實質含義是什麼?

如果乙個點的fail指標指向j,那麼root到j的字串是root到i的字串的乙個字尾。

所以fail指標的含義是:最長的當前字串的字尾在字典樹上可以找到的末尾編號。

求fail指標

首先我們可以確定,每乙個點i的fail指標指向的點的深度一定是比i小的。

第一層的fail一定指的是root。

設點i的父親fa的fail指標指的是fafail,那麼如果fafail有和i值相同的兒子j,那麼i的fail就指向j。(此時我已經懵逼)

具體實現:

void

getfail ()

trie[v].fail=trie[fail].son[i];

q.push(v);}}

}

查詢

int query (char *s) 

u=trie[u].son[v];

}return

ans;

}

完整**

#includeusing

namespace

std;

const

int maxn=2e5+100

;struct

trie trie[maxn];

intn,cnt;

char

s[maxn];

queue

q;void insert (char *s)

trie[u].f++;

} void

getfail ()

trie[v].fail=trie[fail].son[i];

q.push(v);}}

}int query (char *s)

u=trie[u].son[v];

}return

ans;

}int

main ()

AC自動機 學習筆記

是一種數學模型,大概就是由一堆狀態和狀態轉移規則等東西構成,能與外界交換資訊,並改變動作。這個是理論上的東西,了解就行,對ac自動機的理解沒有大影響。通俗的講就是在trie上做kmp,處理多模式串匹配問題。trie 的每個結點就是乙個狀態,根結點是初始狀態。ac自動機的行為被定義為一下3個函式 1....

AC自動機學習筆記

ac自動機是基於字典樹和fail指標來快速一類解決多串匹配的問題。先用所有模式串建乙個字典樹。然後用bfs搞出每個節點的fail指標。fail指標是指向 和當前 字首的字尾有最長匹配的字首。洛谷3808 掃文字串的時候,標記一下訪問過的字典樹上的節點。include using namespace ...

AC自動機學習筆記

title ac自動機學習筆記 date 2020 08 31 15 53 40 tags 8月的最後一天,還是完成了ac自動機的學習。在熟練掌握了kmp後,我發現ac自動機並沒有想象的那麼難,既不難理解,也不難實現,於是決定寫點東西記錄一下。本篇主要談談ac自動機的理論,思想。首先我們必須要明確乙...