这道题目可以使用转换对象法:比如说添加操作,我们不妨将已知字符串删去一个字符(每个已知字符串可以产生 20 20 20个新字符串),然后再建立trie树,然后让查询字符串在trie树上面找就可以了
也可以直接枚举每个查询字符串编辑距离为 1 1 1的字符串,然后在trie树上查找
也要学会一种新算法:trie+dfs,具体见洛谷题解,一般在规模较小的时候可以使用
update 2024.7.25
以上做法不TLE我是没想到的,重新做的时候自己重新想了一个
首先对于删除操作暴力就好了没啥问题,剩下两种操作都差不多,以第三种操作为例
首先对所有单词建立trie树 A A A,再将所有单词反过来建立trie树 B B B,然后建立 26 26 26个虚点表示 26 26 26个字母,这些虚点用来连接 A A A和 B B B;对每一个字符串,设 f [ i ] f[i] f[i]表示其前缀 [ 1 , i ] [1,i] [1,i]所在 A A A上的节点编号, g [ i ] g[i] g[i]表示其后缀 [ i , l ] [i,l] [i,l]所在 B B B上的节点编号,于是对于每一位 i i i,枚举中转字母,在 f [ i − 1 ] f[i-1] f[i−1],中转字母, g [ i + 1 ] g[i+1] g[i+1]之间连边(或用数组记录),然后就可以快速处理查询了