模版 AC自動機

2021-10-08 13:19:05 字數 3623 閱讀 7344

【模版】ac自動機

可以在文字串中查詢多個模式串。

前置知識點:

kmp 演算法

trie 樹

開了乙個 fai

l[i]

fail[i]

fail[i

] 陣列(存的是 tri

etrie

trie

樹上的結點號)

表示 tri

etrie

trie

樹 某個結點 在 文字串上 第 tri

e[i]

[j

]trie[i][j]

trie[i

][j]

號節點匹配上時,跳至 與當前所在模式串的字尾有 公共字首的 下乙個模式串。跳至的目標就是 fai

l[i]

fail[i]

fail[i

]比如兩個模式串 abc

dabcd

abcd

和 ab

cabc

abc 。 在訪問 abc

dabcd

abcd

時的 c

cc 時,會跳去判斷第二個字串 abc

abcab

c 因為 abc

dabcd

abcd

前三個字母 是 abc

abcab

c 的後三個字元,符合字首字尾相同的關係。

t ri

etrie

trie

樹的建立沒有變化,不過建立的是模式串的 tri

etrie

trie

樹 。f ai

l[

]fail

fail

陣列需要提前預處理:

按層數對 tri

etrie

trie

樹進行 bfs

bfsbf

s , 對於每乙個被遍歷到點(無論是否存在子節點),首先判斷其子節點是否是另乙個模式串的字首部分。

如果是(則說明其有子結點),則其子節點的 fai

l[

]fail

fail

陣列 儲存 與該模式串的字尾 有 相同字首的 結點編號。

如果否(則說明其無子節點),則 令其 新創立 tri

e[i]

[j

]trie[i][j]

trie[i

][j]

, 儲存當前點 的fai

l[

]fail

fail

陣列 所記錄點的 子結點。

void

set_fail()

else trie[k]

[i]= trie[fail[k]

][i];}

}

當在文字串上查詢模式串的時候,每當遍歷到乙個結點,跳至其 fai

l[

]fail

fail

結點,如果某一模式串以該結點為結尾,則匹配成功。

int

query

(char st)

return ans;

}

例題:

ac自動機[簡單]

**:

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1000100

;queue <

int> q;

int n,cnt;

char t[maxn]

;int trie[maxn][27

], fail[maxn]

, rt[maxn]

;void

insert

(char st)

rt[k]++;

}void

set_fail()

else trie[k]

[i]= trie[fail[k]

][i];}

}int

query

(char st)

return ans;

}int

main()

set_fail()

;scanf

("%s"

,t);

t[strlen

(t)]

='\0'

;printf

("%d\n"

,query

(t))

;return0;

}

ac自動機[加強]

**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

12000

;const

int maxs =70+

10;queue <

int> q;

int n, cnt;

int trie[maxn][30

], fail[maxn]

, rt[maxn]

;char t[

160]

[maxs]

, key[

1000100];

void

insert

(char st,

int id)

rt[k]

= id;

}void

set_fail

(char st)

else trie[k]

[i]= trie[fail[k]

][i];}

}void

pre_work

(char st)

}int

main()

scanf

("%s"

,key)

;set_fail

(key)

;pre_work

(key)

;int ans =0;

for(

int i =

1; i <= n; i++

) ans =

max)

;printf

("%d\n"

,ans)

;for

(int i =

1; i <= n; i++)if

== ans)

printf

("%s\n"

,t[i]);

cin >> n;

}system

("pause");

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自動機

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

模版 AC自動機(簡單版)

這是一道簡單的ac自動機模版題。用於檢測正確性以及演算法常數。為了防止卡oj,在保證正確的基礎上只有兩組資料,請不要惡意提交。給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。輸入格式 第一行乙個n,表示模式串個數 下面n行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 輸...