Kattis - nvwls (AC自动机last优化 + dp)
作者:互联网
题意
给出一个字典,每个单词去掉元音字母 A、E、I、O、U
之后形成一个新字典。
先给出一个只有辅音组成的串,用原字典中的单词还原该串,若存在多种还原方式,输出还原后元音字母数量最多的那种,若依旧多种,则任意输出。
思路
ac自动机fail树上跑dp的一眼套路题。
总结一下遇到的坑:
- 多个单词去掉元音字母之后形成的新单词相同。
- 若原单词只有辅音字母。
- dp过程中未保证完全还原辅音串。
- 特殊样例将 跳fail的过程卡成了 \(n^2\) 。
解决办法:
- 在字典树的结尾节点保存编号时,保存最大值。
- 将初值从 $0 $ 改为 \(-1\) 。
- dp数组初值同样改为 \(-1\),\(dp[0] = 0\) ,dp只能由非\(-1\)的状态转移。
- 对fail数组进行 last优化。
last[u] = len[fail[u]]? fail[u]: last[fail[u]];
。
last优化
普通方法将建图+匹配的复杂度成功优化为了
标签:AC,last,Kattis,int,maxn,fail,节点,dp 来源: https://www.cnblogs.com/acerkoo/p/11670791.html