之前很喜欢用链表写AC自动机,觉得很适合自己的理解。一直都没有接触数组的写法。。
然而稍微难一点的AC自动机的题,大佬们都是用数组写的,搞的我也看不懂大佬的思路。。
所以觉得重新学习一下数组的写法,但是收获还是有的,又学习了一些关于AC自动机的小优化。
struct acAuto{
int Next[Maxn][26] ;
int num[Maxn], fail[Maxn] ;
int cnt ;
void init(){
memset(Next, 0, sizeof(Next)) ;
memset(num, 0, sizeof(num)) ;
memset(fail, 0, sizeof(fail)) ;
cnt = 0 ;
}
void Insert(string s ){
int root = 0;
for (auto i : s){
int id = i - 'a' ;
if (!Next[root][id]){
Next[root][id] = ++cnt ;
}
root = Next[root][id] ;
}
num[root]++ ;
}
void get_fail(){
queue < int > que ;
for (int i = 0; i < 26; i++){
if (Next[0][i]) {
fail[Next[0][i]]= 0 ;
que.push(Next[0][i]) ;
}
}
while (!que.empty()){
int tmp =
AC自动机数组实现与优化解析

这篇博客探讨了AC自动机的数组实现方法,强调了从链表到数组转变的理解,并介绍了三种优化技巧:路径压缩减少比较时的While循环、后缀连接简化匹配过程以及树形DP优化查询效率。虽然树形DP优化的具体实现博主尚未掌握,但已展示了AC自动机优化的重要性。
最低0.47元/天 解锁文章
1621

被折叠的 条评论
为什么被折叠?



