A
我们不妨使用哈希的方法。
对于每个询问,我们枚举一个可以插入的位置,插入一个新字符之后计算新串的哈希值。
然后查找有没有原串的哈希值和这个一样即可。
B
我们也使用hash的方法,这里可以从原串推一步,从询问串也推一步。
比如询问有没有原串是询问串插入两个,那么就在询问串里枚举位置插入一个,
同时在原串里预处理枚举位置删除一个就行了。
C
让我们考虑计算两个字符串A和B的LCS。
可以看出如果它们开头第一个字符一样的话,我们就可以忽略他们各自的第一个字符。
那么我们不妨递归来计算LCS,考虑A的从i开始的后缀和B的从j开始的后缀的LCS,我们先判断他们的长度差是否已经太大了,然后我们下跳过i和j开始的最长公共子串。
然后A[i]和B[j]就不一样了,我们有3个选择,一个是删除A[i],一个是删除A[j],还有一个是把A[i]改成和B[j]一样。
枚举选择然后递归计算就可以了,复杂度是3^8的。
D
这个题目还是比较直接的,先建出后缀自动机。
容易看出本质上问题就是给你一个树,然后两种询问分别是
询问一个子树里和某个数最接近的数,和一个点到根的路径上和某个数最接近的数。
前者使用启发式合并在树上进行简单计算,后者在dfs的时候顺便维护一下点到根的路径上的
点权集合就可以了。
新串指的是在5个位置上插入‘a'-'z'能得到的130种新串。关键是使用rolling-hash使得计算每一个新串哈希值的均摊复杂度是O(1)的。