AC自動機模板

2021-08-06 02:28:57 字數 1738 閱讀 9397

ac自動機講解: ------------>(講的很簡單也很清楚的博文位址)

ac自動機理解的部分還是很好理解的,字典樹加上kmp的匹配失敗轉移的思想。

只是ac自動機的**部分比較難理解。

以下是自己對ac自動機模板以及理解部分。

模板:

#include #include #include #include #include #include using namespace std;

const int maxn=1e6+50;

struct tries

/*創立新節點;

*/void init()

/*初始化;

*/void insert(char buf)

end[now]++ ;}/*

插入新的字串;

如果該字元沒有在該位置出現過,則建立新的節點;

如果出現過,則繼續向後更新;

每次對該字串的數目進行更新;

*/void build()

while(!q.empty())}}

/*建立匹配失敗時的轉移陣列;

根節點與第一層部分匹配失敗後轉移至根節點部分;

其他部分則轉移至該字元出現過的節點位置;

*/int query(char buf)

}return res;}/*

輸入需要拿來匹配的串;

一次次的對當前串的各位進行匹配,如果包含當前字元的串在字典樹中有出現,則答案累計加上該出現次數,且跳轉轉移節點進行計數;

因為end記錄的是出現的次數,所以在需要匹配的串中如果有該字元,那麼進行清0,則能保證字典樹中的串在母串中出現一次;

*/};tries ac;

hdu2222:

#include #include #include #include #include #include using namespace std;

const int maxn=1e6+50;

struct tries

/*創立新節點;

*/void init()

/*初始化;

*/void insert(char buf)

end[now]++ ;}/*

插入新的字串;

如果該字元沒有在該位置出現過,則建立新的節點;

如果出現過,則繼續向後更新;

每次對該字串的數目進行更新;

*/void build()

while(!q.empty())}}

/*建立匹配失敗時的轉移陣列;

根節點與第一層部分匹配失敗後轉移至根節點部分;

其他部分則轉移至該字元出現過的節點位置;

*/int query(char buf)

}return res;}/*

輸入需要拿來匹配的串;

一次次的對當前串的各位進行匹配,如果包含當前字元的串在字典樹中有出現,則答案累計加上該出現次數,且跳轉轉移節點進行計數;

因為end記錄的是出現的次數,所以在需要匹配的串中如果有該字元,那麼進行清0,則能保證字典樹中的串在母串中出現一次;

*/};tries ac;

char str[maxn];

int main()

{ int t;

int n;

scanf("%d",&t);

while(t--)

{ac.init();

scanf("%d",&n);

for(int i=0;i

AC自動機模板

ac自動機模板 ac自動機模板 使用方法 1 init 初始化函式 2 insert str 插入字串函式 3 build 構建ac自動機 4 query str 返回出現的字串個數 使用需注意事項 1 注意輸入的字元的範圍,需對next和其二維大小及相關引數進行更改 2 注意next fail和e...

AC自動機模板

ac自動機主要是用於多模式串的匹配問題,按照我的理解,ac自動機就是在tire樹上實現kmp演算法,由於ac自動機加入了失敗指標,所以可以把他看成乙個狀態轉移的圖。給出模板 include include include include includeusing namespace std cons...

模板 AC自動機

我覺得ac自動機的難點和核心是構建失敗指標,父親的失敗指標的兒子 son2 中有和兒子 son1 相同的,即為son1的失敗指標 例 還是有個不懂的地方 第90行,跪求大佬賜教 include include include include include include include inclu...