#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;
}
ac_automaton 模板
最新推荐文章于 2020-08-02 15:38:50 发布