【做题记录】P4965 薇尔莉特的打字机
-
薇尔莉特的打字机
- 算法:trie
题目:
初始有一个仅由大写字母组成的长度为 的字符串 。现在有 次操作,每次操作输入字符 ,若 是大写字母则表示在字符串后加入此字符串,否则表示将当前字符串最后一位删除(若字符串为空则不删除)。
对于每次操作都有可能会失效。问最后有多少种可能的字符串。
。
题解:
考虑建出一个 trie,用节点表示字符串。
由于若我当前得到一个字符串 ,那么最终我也必然可以得到 ,即后面的操作全部失效。
将当前可能表示出来的字符串建出来。那么答案就是整棵树。
我们考虑加入一个字符的贡献。
设当前有 个点。
我们设 表示当前有多少个点的儿子中有 。
那么贡献为 。
因为原本就有 个节点包含了 ,那么它们再加上 就会算重。
而不考虑这些 就是所有节点都新加一个为 的儿子。
考虑转移 ,结论是 。因为现在所有点都有了 这个儿子。
考虑删除。
我们可以看做此时假如所有加入的字母全部失效,那么删除的必将是 中的字母。
我们可以证明若删除的贡献只能在 中删除,不能在后来加入的字母中删除,因为这样没有贡献(会在第一种情况算重)。
所以删除的贡献只为 。
具体地,考虑设当前一共有 个删除,那么我们最多会删除到 这个点。所以加上的贡献就是 的字符串。
然后此时 的转移为 ,因为多的一种即为当前 加入 trie 后新得到的儿子 。
时间复杂度 。代码实现易。
本文作者:trsins
本文链接:https://www.cnblogs.com/trsins/p/15815389.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步