您的位置:首页 > 其它

ac自动机模板

2016-08-04 11:08 323 查看
指针版写法:

struct node  

{  

    int val;  

    node *next[26];  

    node *fail;  

    node()  

    {  

        val = 0;  

        for(int i = 0; i < 26; i++)  

            next[i] = NULL;  

        fail = NULL;  

    }  

};  

node *root;  

  

void insert(char *s)  

{  

    int n = strlen(s);  

    node *curr = root;  

    for(int i = 0; i < n; i++)  

    {  

        int c = s[i] - 'a';  

        if(curr->next[c] == NULL)  

        {  

            node *newnode = new node;  

            curr->next[c] = newnode;  

        }  

        curr = curr->next[c];  

          

    }  

    curr->val++;  

}  

  

void build()  

{  

    root->fail = NULL;  

    queue <node*> Q;  

    Q.push(root);  

    while(!Q.empty())  

    {  

          

        node *temp = Q.front();  

        node *p = NULL;  

        Q.pop();  

        for(int i = 0; i < 26; i++)  

        {  

            if(temp->next[i] == NULL)  

                continue;  

            if(temp == root)  

                temp->next[i]->fail = root;  

            else  

            {  

                p = temp->fail;  

                while(p != NULL)  

                {  

                    if(p->next[i] != NULL)  

                    {  

                        temp->next[i]->fail = p->next[i];  

                        break;  

                    }  

                    p = p->fail;  

                }  

                if(p == NULL)  

                    temp->next[i]->fail = root;  

            }  

            Q.push(temp->next[i]);  

        }  

    }  

}  

void find(char *s)  

{  

    int n = strlen(s);  

    node *p = root;  

    for(int i = 0; i < n; i++)  

    {  

        int c = s[i] - 'a';  

        while(p != root && p->next[c] == NULL)  

            p = p->fail;  

        p = p->next[c];  

        if(p == NULL)  

            p = root;  

        node *temp = p;  

        while(temp != root)  

        {  

            ans += temp->val;  

            temp->val = 0;  

            temp = temp->fail;  

        }  

    }  

}  

  

void del(node *p)  

{  

    for(int i = 0; i < 26; i++)  

    {  

        if(p->next[i] != NULL)  

            del(p->next[i]);  

    }  

    free(p);  

}  
数组版写法

const int maxnode = 500*210;  

const int size = 128;  

int ch[maxnode][size];  

int val[maxnode];  

int f[maxnode];  

int sz;  

bool id[maxn];  

void init()  

{  

    sz = 1;  

    memset(ch[0], 0, sizeof(ch[0]));  

}  

void insert(char *s, int v)  

{  

    int u = 0, n = strlen(s);  

    for(int i = 0; i < n; i++)  

    {  

        int c = s[i];  

        if(!ch[u][c])  

        {  

            memset(ch[sz], 0, sizeof(ch[sz]));  

            val[sz] = 0;  

            ch[u][c] = sz++;  

        }  

        u = ch[u][c];  

    }  

    val[u] = v;  

}  

void getFail()  

{  

    queue <int> q;  

    f[0] = 0;  

    for(int c = 0; c < size; c++)  

    {  

        int u = ch[0][c];  

        if(u)  

        {  

            f[u] = 0;  

            q.push(u);  

        }  

    }  

    while(!q.empty())  

    {  

        int r = q.front(); q.pop();  

          

        for(int c = 0; c < size; c++)  

        {  

            int u = ch[r][c];  

            if(!u)  

            {  

                ch[r][c] = ch[f[r]][c];  

                continue;  

            }  

            q.push(u);  

            f[u] = ch[f[r]][c];  

        }  

    }  

}  

  

void find(char *s, int num)  

{  

    int n = strlen(s);  

    int j = 0;  

    for(int i = 0; i < n; i++)  

    {  

        j = ch[j][s[i]];  

        int temp = j;  

        while(temp)  

        {  

            if(val[temp] > 0)  

            {  

                ;  

            }  

            temp = f[temp];  

        }  

    }  

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: