ac_automaton 模板

来源:互联网 发布:mafia 2 mac 编辑:程序博客网 时间:2024/05/23 14:32
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int MAXN = 500010;struct Trie_Node{Trie_Node* fail;Trie_Node* pNext[26];int cnt;Trie_Node(){fail = NULL;cnt = 0;memset(pNext, NULL, sizeof(pNext));}};Trie_Node* proot;Trie_Node* q[MAXN];int head, tail;void Insert_Trie(char* str){Trie_Node* p = proot;for (; *str; str++){int j = *str - 'a';if (p->pNext[j] == NULL){p->pNext[j] = new Trie_Node;}p = p->pNext[j];}p->cnt++;}void Build_ac_automaton_fail(){int i = 0;head = tail = 0;proot->fail = NULL;q[tail++] = proot;while (head != tail){Trie_Node* temp = q[head++];Trie_Node* p = NULL;for (i = 0; i < 26; ++i){if (temp->pNext[i] != NULL){if(temp == proot)temp->pNext[i]->fail = proot;else{p = temp->fail;while (p){if(p->pNext[i]){temp->pNext[i]->fail = p->pNext[i];break;}p = p->fail;}if(p == NULL)temp->pNext[i]->fail = proot;}q[tail++] = temp->pNext[i];}}}}int Query(char* str){Trie_Node* p = proot;int i = 0, sum = 0;while(str[i]){int j = str[i] - 'a';while (p->pNext[j] == NULL && p != proot)p = p->fail;p = (p->pNext[j] == NULL) ? proot : p->pNext[j];Trie_Node* temp = p;while (temp  != proot && temp->cnt != -1){sum += temp->cnt;temp->cnt = -1;temp = temp->fail;}++i;}return sum;}int main(){return 0;}