[jzoj]3472. 【NOIP2013模拟联考8】匹配(match)(AC自动机+DP)

来源:互联网 发布:思迅会计软件 编辑:程序博客网 时间:2024/06/06 20:16

Problem

给定k个字符串以及长度为n的母串可选字母的集合,问母串要完整出现给定的k个字符串的方案数,答案模1000000007,字符仅包含小写字母。

Data constraint

30%的数据n<=10,m<=3。

60%的数据n<=40。

另有10%的数据k=0。

另有10%的数据m=1。

100%的数据n<=100,m<=10,k<=8,给定字符串长度<=30。

Solution

  • 明眼人都看到了这里的k很小,是否可以考虑状压呢?

  • 但是,如何记录每一个字符串当前的状态,这是个麻烦.

AC自动机的引入

  • AC自动机= Trie + kmp

  • 简单来说就是利用了KMP的思想,再用Trie去实现.

  • AC自动机的模型是:

    • 给定m个匹配串,给定长度为n的模式串,要求有多少个匹配串出现在模式串里.

    • 让我们来看一道裸题:http://acm.hdu.edu.cn/showproblem.php?pid=2222

    • AC自动机的核心是:fail指针.

    • fail指针的含义如下:

      • 一个节点rootfail指针指向的k的儿子中有一个root节点字符.
    • 想要彻底弄懂fail指针并不是很简单,这里不详细讲述.

    • 构建fail,采取bfs.

    • 随后,我们扫一遍匹配串,然后如果当前节点能在Trie里继续往下走,我们就走,否则跳到fail指针,显然这样的策略是最优的.

    • 这里有两个小细节需要注意:

      • ①构建fail时,我们的首选肯定是其父亲的fail指针所往下的点,但事实上,大部分情况下,我们可能不能继续往下

        • 这时候,我们并不是直接把这个节点的fail指向root,而是继续往期的fail[fail[root]]找,一直fail>fail>fail直到找到为止.
      • ②在查询答案时,指针走到了一个节点j,不能只加上这一个节点的贡献,而要把其对应的fail>fail>fail都给更新完.

        • 为了保证匹配是O(n)的,我们一个节点如果已经作出贡献,就标记一下,保证下次不再更新.
  • 对于这道题,如果掌握了AC自动机,那就显得非常easy了

  • 我们显然就是设f[i][j][s]表示到AC自动机第i个点,构建到了字符串的第j位,已被匹配完的串状态为S的方案数.

  • 枚举下一个点选什么即可.

  • 同时也要注意“AC自动机”的注意②

阅读全文
0 0
原创粉丝点击