AC自动机总结

Posted zhoushuyu

tags:

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

AC自动机总结

自动机的概念:

自动机又称有限状态机,是从初始状态不断接受输入,根据输入数据和当前状态跳转到下一状态的一种机器。

AC自动机可以实现多串匹配单串。复杂度是\(O(n+m)\),也就是匹配串长+模式串总长。
AC自动机匹配失配时,类似KMP算法的next数组,AC自动机上有fail指针可以跳到下一个应该进行匹配的状态。
fail指针的一般定义是:沿着父亲的fail指针一直向上跳,直到跳到某一个节点,这个节点拥有与自己相同字母的子节点,那么fail指针就指向这个相同字母的子节点。
一般写起来是这样的

void Get_Fail()
{
    for (int i=0;i<26;i++) if (ch[i][0]) Q.push(ch[i][0]);
    while (!Q.empty())
    {
        int u=Q.front();Q.pop();
        for (int i=0;i<26;i++)
            if (ch[i][u]) fail[ch[i][u]]=ch[i][fail[u]],Q.push(ch[i][u]);
            else ch[i][u]=ch[i][fail[u]];
    }
}

这样相当于建出了一个Trie图,使得每个节点都拥有了26个儿子。如果你想要保存原Trie树的话请先备份。
一般来说插入一个模式串就是

void Insert(string c,int ID)
{
    int l=c.length(),x=0;
    for (int i=0;i<l;i++)
    {
        if (!ch[c[i]-'a'][x]) ch[c[i]-'a'][x]=++tot;
        x=ch[c[i]-'a'][x];
    }
    id[x]=ID;
}

然后因为AC自动机本身就和“状态”关系密切,所以AC自动机上往往会用来跑DP。
然后如果你不记得KMP怎么写了也可以写AC自动机。

几个小tips

如果是给出若干个串求匹配,由fail指针串起来的点是一个点,意思是如果你匹配了一个串,那么你同时也匹配了这个串的任意后缀。所以你在AC自动机上每走过一个点,就要暴跳fail到root进行匹配。
但如果是给出若干不合法串求合法方案数,这时由fail指针串起来的点就不是一个点,因为假使认为是同一个点会导致不合法状态计入。同时,不合法标记要沿着fail下传,意思是如果某一个串不合法,那么以这个串为前缀的任意串都不合法。

题目也不算多,因为基本上都是一样的,所以就不放代码直接嘴巴AC了。

[HNOI2004]L语言

题面
\(f_i\)表示文章的前\(i\)个字符是否可以被理解。每次匹配要暴跳fail到根,转移就是\(f_i|=f_{i-len}\),其中\(len\)是某个可以匹配的模式串的串长。
code

[USACO15FEB]审查Censoring

题面
开一个栈记录依次经过的AC自动机上的节点编号以及这一次的字母,若匹配到一个串就直接弹掉栈顶的\(len\)个元素,\(len\)为匹配到的模式串长度。弹栈顶直接\(top-=len\)即可。
code

[SDOI2014]数数

题面
AC自动机做数位DP。首先位数小于\(n\)的位数的数只要满足没有不合法串即可,记\(f_{i,j}\)表示填了\(i\)个数,当前在AC自动机上编号为\(j\)的节点上的方案数,取答案\(\sum_{i=1}^{n-1}\sum_{j=0}^{tot}f_{i,j}\)
位数等于\(n\)的,在前面那个状态上多加一维,表示是否已经严格小于那个数,然后按照数位DP的一般思路卡一卡就好了。
code

[HNOI2008]GT (搞颓)考试

题面
先考虑\(O(nm)\)的转移。设\(f_{i,j}\)表示填了\(i\)个数,当前在AC自动机上编号为\(j\)的节点上的方案数(和上面的一模一样)。
发现每次从\(f_i\)转移到\(f_{i+1}\)的转移都是一样的,所以可以矩阵快速幂优化DP转移,复杂度\(O(m^3\log{n})\)
code
(留坑待补。。。)

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

POJ3691DNA repair(AC自动机,DP)

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

AC自动机总结及板子

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

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

AC自动机总结