1. 程式人生 > >AC自動機模板

AC自動機模板

insert 自動機 mat roo oot node truct amp 字典樹

struct node
{
    node *next[26];
    node *fail;
    int sum;
};

int cnt;
node *root;

//構造字典樹
void Insert(char *s)
{
    node *newnode,*p;
    p = root;
    for(int i = 0; s[i]; i++)
    {
        int x = s[i] - a;
        if(p->next[x] == NULL)
        {
            newnode
=(struct node *)malloc(sizeof(struct node)); for(int j=0; j<26; j++) newnode->next[j] = 0; newnode->sum = 0; newnode->fail = 0; p->next[x]=newnode; } p = p->next[x]; } p->sum++; } //BFS構造fail指針 node *q[maxn];
void build_fail_pointer() { int head,tail; head = 0; tail = 1; q[head] = root; node *p; node *temp; while(head < tail) { temp = q[head++]; for(int i = 0; i <= 25; i++) { if(temp->next[i]) {
if(temp == root) { temp->next[i]->fail = root; } else { p = temp->fail; while(p) { if(p->next[i]) { temp->next[i]->fail = p->next[i]; break; } p = p->fail; } if(p == NULL) temp->next[i]->fail = root; } q[tail++] = temp->next[i]; } } } } //匹配 void ac_automation(char *ch) { node *p = root; int len = strlen(ch); for(int i = 0; i < len; i++) { int x = ch[i] - a; while(!p->next[x] && p != root) p = p->fail; p = p->next[x]; if(!p) p = root; node *temp = p; while(temp != root) { if(temp->sum >= 0) { cnt += temp->sum; temp->sum = -1;  //也可以用vis數組標記 } else break; temp = temp->fail; } } }

AC自動機模板