【模版】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行每行乙個模式串 下面一行乙個文字串。輸出格式 乙個數表示答案 輸...