AC自动机

Posted lhm-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC自动机相关的知识,希望对你有一定的参考价值。

构建字典图实现自动跳转,构建失配指针实现多模式匹配

(fail)指针表示文本串在当前节点失配后,我们应该到哪个节点去继续匹配,(u)(fail)指针指向(v)表示从根到(v)的字符串为从根到(u)的字符串的最长后缀,用(bfs)来构建(fail)指针

(fail[trie[x][i]]=trie[fail[x]][i])

相当于在(x)(fail[x])后面加一个字符(i),就构成(fail[trie[x][i]])

若发现(trie[x][i])不存在,则直接将其(trie[fail[x]][i])赋值给它,来实现一个类似于路径压缩的操作

(code)

void insert(char *str)
{
    int len=strlen(str),cur=0;
    for(int i=0;i<len;++i)
    {
        int ch=str[i]-'a';
        if(!trie[cur][ch])
            trie[cur][ch]=++tot;
        cur=trie[cur][ch];
    }
    num[cur]++;
}
void build()
{
    queue<int> q;
    for(int i=0;i<26;++i)
        if(trie[0][i])
            q.push(trie[0][i]);  
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=0;i<26;++i)
        {
            int y=trie[x][i];
            if(y)
            {
                fail[y]=trie[fail[x]][i];
                q.push(y);
            }
            else trie[x][i]=trie[fail[x]][i];
        }
    }
}
int query(char *str)
{
    int len=strlen(str),cur=0,ans=0;
    for(int i=0;i<len;++i)
    {
        int ch=str[i]-'a';
        cur=trie[cur][ch];
        for(int j=cur;num[j]!=-1&&j;j=fail[j])
            ans+=num[j],num[j]=-1;
    }
    return ans;
}

以上是关于AC自动机的主要内容,如果未能解决你的问题,请参考以下文章

POJ3691DNA repair(AC自动机,DP)

HDU4057 Rescue the Rabbit(AC自动机+状压DP)

Codeforces 86C Genetic engineering(AC自动机+DP)

POJ1699 Best Sequence(AC自动机+状压DP)

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

HDU2457 DNA repair(AC自动机+DP)