Kattis - nvwls (AC自动机last优化 + dp)

Kattis - nvwls (AC自动机last优化 + dp)

题意

给出一个字典,每个单词去掉元音字母 A、E、I、O、U 之后形成一个新字典。

先给出一个只有辅音组成的串,用原字典中的单词还原该串,若存在多种还原方式,输出还原后元音字母数量最多的那种,若依旧多种,则任意输出。

传送门

思路

ac自动机fail树上跑dp的一眼套路题。

总结一下遇到的坑:

  1. 多个单词去掉元音字母之后形成的新单词相同。
  2. 若原单词只有辅音字母。
  3. dp过程中未保证完全还原辅音串。
  4. 特殊样例将 跳fail的过程卡成了 \(n^2\)

解决办法:

  1. 在字典树的结尾节点保存编号时,保存最大值。
  2. 将初值从 $0 $ 改为 \(-1\)
  3. dp数组初值同样改为 \(-1\)\(dp[0] = 0\) ,dp只能由非\(-1\)的状态转移。
  4. 对fail数组进行 last优化last[u] = len[fail[u]]? fail[u]: last[fail[u]];

last优化

普通方法将建图+匹配的复杂度成功优化为了