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