AC自動機模版 字串

2021-10-23 17:03:16 字數 2318 閱讀 5679

ac自動機主要用於解決多模式串的匹配問題(具體指的是:如下圖中 模式串 p中有多個 字串,問這些字串在 主串s的出現的總次數),

是字典樹(trie樹)的變種,一種偽樹形結構(主體是樹形的,但是由於加入了失敗指標,使得它變成了乙個有向圖);

//以當前節點為終點的 模式字串 的數量

int fail =-1

;//fail == -1 表示沒有指向的節點了,fail == 0 表示當前節點的 fail指標指向 根節點0,,,注意根節點0 也是沒有指向的節點的,所以它的fail指標也是指向 -1點};

vector trie;

int idx =0;

void

insert

(string s)

trie[p]

.cnt ++;}

void

fail_pre()

}while

(q.size()

)}}}

intquery

(string s)

}return ans;

}int

main()

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int maxn =2*

1e6+9;

int trie[maxn][26

];//字典樹

int cntword[maxn]

;//記錄該單詞出現次數

int fail[maxn]

;//失敗時的回溯指標

int cnt =0;

void

insertwords

(string s)

cntword[root]++;

//當前節點單詞數+1

}void

getfail()

}//fail[now] ->當前節點now的失敗指標指向的地方

//tire[now][i] -> 下乙個字母為i+'a'的節點的下標為tire[now][i]

while

(!q.

empty()

)else

//否則就讓當前節點的這個子節點

//指向當前節點fail指標的這個子節點

trie[now]

[i]= trie[fail[now]

][i];}

}}intquery

(string s)

}return ans;

}int

main()

fail[0]

=0;getfail()

; cin >> s ;

cout <<

query

(s)<< endl;

return0;

}

ac自動機模版

字尾陣列 include include include using namespace std const int maxn 200000 100 int wa maxn wb maxn wv maxn ws maxn int rank maxn height maxn int sa maxn r...

模版 AC自動機

模版 ac自動機 可以在文字串中查詢多個模式串。前置知識點 kmp 演算法 trie 樹 開了乙個 fai l i fail i fail i 陣列 存的是 tri etrie trie 樹上的結點號 表示 tri etrie trie 樹 某個結點 在 文字串上 第 tri e i j trie ...

演算法模版 AC自動機

板子不再贅述,oi wiki有詳細講解。query 函式則是遍歷文字串的所有位置,在文字串的每個位置都沿著 fail 跳到根,將沿途所有元素答案 意義在於累計所有以當前字元為結尾的所有模式串的答案。看 就能很容易的理解。另外 e i 記錄的是第 t 個模式串結尾是哪個節點 所有節點均有唯一的編號 貼...