AC自动机算法

/* 程序说明:多模式串匹配的AC自动机算法 此题通过hdu 2222 自动机算法可以参考《柔性字符串匹配》里的相应章节,讲的很清楚 */ #include <stdio.h> #include <string.h> const int MAXQ = 500000+10; const int MAXN = 1000000+10; const int MAXK = 26; //自动机里字符集的大小 struct TrieNode { TrieNode* fail; TrieNode* next[MAXK]; bool danger; //该节点是否为某模式串的终结点 int cnt; //以该节点为终结点的模式串个数 TrieNode() { fail = NULL; memset(next, NULL, sizeof(next)); danger = false; cnt = 0; } }*que[MAXQ], *root; //文本字符串 char msg[MAXN]; int N; void TrieInsert(char *s)//建立字典树 { int i = 0; TrieNode *ptr = root; while(s[i]) { int idx = s[i]-'a'; if(ptr->next[idx] == NULL) ptr->next[idx] = new TrieNode(); ptr = ptr->next[idx]; i++; } ptr->danger = true; ptr->cnt++; } void Init() { int i; char s[100]; root = new TrieNode(); scanf("%d", &N); for(i = 0; i < N; i++) { scanf("%s", s); TrieInsert(s); } } /* 构造失败指针 然后构造失败指针,应当使用BFS算法。失败指针满足下面的性质: 假设有一个节点k,他的失败指针指向j。那么k,j满足:设root到j的距离为n,则从k之上的 第n个节点到k所组成的长度为n的单词,与从root到j所组成的单词相同。 */ void Build_AC_Automation() { int rear = 1, front = 0, i; que[0] = root; root->fail = NULL; while(rear != front) { TrieNode *cur = que[front++]; for(i = 0; i < 26; i++) if(cur->next[i] != NULL) { if(cur == root)//第一个节点的失败指针指向根节点 cur->next[i]->fail = root; else { TrieNode *ptr = cur->fail; while(ptr != NULL) { if(ptr->next[i] != NULL) { cur->next[i]->fail = ptr->next[i]; if(ptr->next[i]->danger == true)//如果当前已是一个模式串 cur->next[i]->danger = true; break; } ptr = ptr->fail; } if(ptr == NULL) cur->next[i]->fail = root; } que[rear++] = cur->next[i]; } } } int AC_Search() { int i = 0, ans = 0; TrieNode *ptr = root; while(msg[i]) { int idx = msg[i]-'a'; while(ptr->next[idx] == NULL && ptr != root) ptr = ptr->fail; ptr = ptr->next[idx]; if(ptr == NULL) ptr = root; TrieNode *tmp = ptr; while(tmp != NULL && tmp->cnt != -1) { ans += tmp->cnt; tmp->cnt = -1; tmp = tmp->fail; } i++; } return ans; } int main() { freopen("in.txt","r",stdin); int T; scanf("%d", &T); while(T--) { Init(); Build_AC_Automation(); //文本 scanf("%s", msg); printf("%d/n", AC_Search()); } return 0; }

你可能感兴趣的:(算法,struct,null,search,Build)