字胡串乱做

[USACO12DEC]First! G

一个串是另一个串的前缀是平凡的。当一个串能够作为第一个时,在所有串相同的位置上这个串的字母最大,我们只需要判断做出来的顺序是否合法即可。考虑顺序靠前的向顺序靠后的连边,判断有没有环,拓扑排序是好做的。快速查询一个串是否是另一个串的前缀,以及在相同的长度位置上有哪些字母,可以建出 Trie 后枚举枚举。

[JSOI2009] 电子字典

通配符匹配。先建出 Trie,然后在 Trie 上 dfs 统计答案。因为要求编辑距离为 \(1\),所以只需要知道之前有没有操作过。记一个查找状态为 \(d_{now,pos,op}\) 为当前在 Trie 树上的位置 \(now\),匹配到了当前串第 \(pos\) 位,有没有进行过编辑。删除相当于 \(now\) 不变,\(pos\) 往后一位;添加相当于 \(pos\) 不变,\(now\) 往后跳一个;替换相当于 \(pos\)\(now\) 都向后操作,注意判断边界。

[IOI2008] Type Printer

注意到操作过程等价于在 Trie 树上跑,由于最后一个单词不需要删除,所以最后去最长的单词,先搜一遍记录深度即可。

[AHOI2005] 病毒检测

通配符匹配。\(\text{?}\) 操作即为替换,将 \(\text{#}\) 视作 \(\text{?#}\) 递归下去即可。边界情况显然为超出了匹配串的总长。

[CF432D] Prefixes and Suffixes

KMP 统计前后缀出现次数。前缀函数 \(nxt\) 存的是当前位置上的最长 border 的长度,因此如果一个位置上有长度为 \(i\) 的 border,那么必定有长度为 \(nxt_i\) 的 border,以及 \(nxt_{nxt_i}\) 的 border 等等,直到长度变成最小的 \(1\)。首先正序统计每个 \(nxt\) 值出现的次数,然后倒序将次数贡献给 border 的 border,最后考虑原始的前缀长度,因此给每个值再加一。

posted @ 2023-02-28 08:42  LgxTpre  阅读(35)  评论(0编辑  收藏  举报