AC自動機演算法

2021-09-05 10:53:48 字數 1608 閱讀 1189

簡而言之,就是在kmp演算法的思想上加上trie樹來實現的乙個適合多個模式串的匹配問題。kmp演算法時間複雜度優秀的原因是有乙個next陣列,也叫做失配指標陣列,使得匹配的時間複雜度嚴格o(m

+n

)o(m+n)

o(m+n)

,ac自動機也有這樣的陣列來在失配的時候去跳到相應應該去的地方。所以,ac自動機分兩步:

1.建立trie樹存下模式串

2.創造next失配指標

trie樹,就是把字串像一棵樹一樣的存起來的資料結構,減少了需要的空間,也減少查詢的時間複雜度。

**實現

int cntn=0;

//節點個數

void

insert_string

(char st)

now=trie[now]

.nxt[st[i]

-'a'];

} trie[now]

.cnt++

;//最後cnt統計單詞個數

}

我們用bfs的形式去創造失配指標。

根節點直接連著的結點的失配指標都指向根節點。

再下面的結點,就指向父親的fail的與其相同結點,如果父親的fail沒有與其相同的結點,當然就指向根了。

void

make_fail()

}while

(!q.

empty()

)else}}

}

不用多說了。

int

match

(char st)

}return res;

}

習題:p3808 【模板】ac自動機

#include

#include

#include

#include

#define maxl 1000010

#define kind 26

#define root 0

using

namespace std;

int n;

char s[maxl]

;struct nodetrie[maxl]

;int cntn=0;

void

insert_string

(char st)

now=trie[now]

.nxt[st[i]

-'a'];

} trie[now]

.cnt++;}

void

make_fail()

}while

(!q.

empty()

)else}}

}int

match

(char st)

}return res;

}int

main()

make_fail()

;scanf

("%s"

,s);

printf

("%d"

,match

(s))

;return0;

}

AC自動機演算法

ac自動機簡介 首先簡要介紹一下ac自動機 aho corasickautomation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹trie和kmp...

AC自動機演算法

ac自動機簡介 首先簡要介紹一下ac自動機 aho corasick automation,該演算法在1975年產生於貝爾實驗室,是著名的多模匹配演算法之一。乙個常見的例子就是給出n個單詞,再給出一段包含m個字元的文章,讓你找出有多少個單詞在文章裡出現過。要搞懂ac自動機,先得有字典樹trie和km...

演算法 AC自動機

這篇部落格拖了好久好久,真是尷尬,原因大概是我感覺很多東西,都是直覺,有種只可意會不可言傳的味道,想完全搞懂,但後來仔細想想,ac自動機好像本來就不是乙個非常非常確定的演算法,比如說,我該拿覺很多情況可以把演算法卡成n 2。所以拖了很久,醬紫。先談談ac自動機是什麼。我們知道kmp,可以快速的對乙個...