电子字典

这道题目可以使用转换对象法:比如说添加操作,我们不妨将已知字符串删去一个字符(每个已知字符串可以产生\(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]\)之间连边(或用数组记录),然后就可以快速处理查询了

posted @ 2024-01-24 19:35  最爱丁珰  阅读(3)  评论(0编辑  收藏  举报