最近在看字串匹配演算法,參考了文章:
以下我給出了ac演算法的c語言實現,題目是
/** ac.c--多模式匹配演算法
** created on: jul 14, 2011
* author: root
*/#include
<
stdio.h
>
#include
<
malloc.h
>
#include
<
stdlib.h
>
#include
<
string
.h>
struct
node
;typedef
struct
node node;
node *q[
5001
];//
char
keyword[
51];
//char
str[
1000001
];//
字串int
head, tail;
//佇列的頭、尾指標
/*插入節點到字典樹中
*/void
insert(
char
*str,node
*root) /*
如果不存在那個節點,首先得建立節點
*/p =p
->
next[index];i++
;}p->
count =1
;//表示此節點為最後乙個詞}/*
失敗指標的建立
*/void
build_fail(node
*root)
elsep =
p->
fail;
/*如果上乙個if不成立,則繼續向上查詢*/}
if(p
==null)
}q[head
++]
=temp
->
next[i];}}
}}intquery(node
*root,
char
*str)
//統計匹配到的關鍵字i++
;}return
cnt;
}int
main()
build_fail(root);
//建立失敗指標
scanf("%s
", str);
printf(
"%d\n
", query(root,str));
//根據輸入字串查詢關鍵字出現次數
}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,可以快速的對乙個...