簡而言之,就是在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,可以快速的對乙個...