[jzoj]3472. 【NOIP2013模拟联考8】匹配(match)(AC自动机+DP)
2017-11-27 21:18
375 查看
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指针的含义如下:
一个节点root的fail指针指向的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自动机”的注意②
相关文章推荐
- [jzoj3472]【NOIP2013模拟联考8】匹配(match)
- 3472. 【NOIP2013模拟联考8】匹配(match)
- [jzoj]3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll)(匈牙利-二分图最大匹配)
- jzoj3501 【NOIP2013模拟联考15】消息传递(news) 树形dp
- [jzoj]3468. 【NOIP2013模拟联考7】OSU!(osu) (期望DP)
- 【NOIP2013模拟联考12】数数(数位dp||类欧几里得)
- JZOJsenior3488.【NOIP2013模拟联考11】矩形(rect)
- 5332. 【NOIP2017提高A组模拟8.23】密码 AC自动机+数位DP
- jzoj[3521]. 【NOIP2013模拟11.7B组】道路覆盖(cover) (状压DP)
- JZOJsenior3470.【NOIP2013模拟联考8】最短路(path)
- [jzoj]3479. 【NOIP2013模拟联考9】工作安排(work)
- JZOJ3501. 【NOIP2013模拟联考15】消息传递
- [jzoj]3499. 【NOIP2013模拟联考15】人类基因组(genes) (单调队列、前缀和、线段树解一题)
- [jzoj]3486. 【NOIP2013模拟联考10】道路改建(rebuild)(缩环+Tarjan+拓扑+bitset记录状态)
- [jzoj]3480. 【NOIP2013模拟联考9】阿Q的停车场(park)(线段树+堆)
- jzoj 3467. 【NOIP2013模拟联考7】最长上升子序列(lis) dfs+lis+手工栈
- JZOJ3455. 【NOIP2013模拟联考3】库特的向量(code)
- JZOJ 3498【NOIP2013模拟联考14】图形变换
- 【JZOJ 3492】【NOIP2013模拟联考12】数数(count)
- JZOJsenior3455.【NOIP2013模拟联考3】库特的向量(code)