hihoCoder Challenge 17题解

0
2

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的时候顺便维护一下点到根的路径上的 点权集合就可以了。

8 answer(s)

0

C题不是一个判断就为3^8,要判断n^2次 不会超时吗

0

我复制第一的那个第一题的代码结果TLE,比赛的时候我和他写的基本一样结果TLE到死

0

第一题仍然不是很理解解法。比如:原串是abcde,abfde,询问串是abfd,那么新串指的是什么?计算谁的哈希值?

  • 新串指的是在5个位置上插入‘a'-'z'能得到的130种新串。关键是使用rolling-hash使得计算每一个新串哈希值的均摊复杂度是O(1)的。

  • 原来如此,受教了,非常感谢!

  • 添加评论
  • reply
0

有标程吗第三题的题解没理解

0

hash怎么可以当标解,有判重吗?

1

给数据也是跪了,看看第一过的C,那个复杂度能行?。。。

  • 原来题解都是3^n,膝盖已碎

  • 我觉得这里应该是出题人笔误了,应该是3^8

  • 那软壳1的暴力我是不是应该%%%有勇气

  • 添加评论
  • reply
4

hash函数应该怎么设计呢? 依次删除原串中的字符,用STL,如果不在set里,map加一,结果超时了。。。

  • 我也用的hash, 使用STL的unordered_map 与 unordered_set 结果3500ms。 题解单纯告诉我们使用hash完全没有意义啊。怎么可以看到别人的代码?

  • 添加评论
  • reply
1

为什么T2最基本的暴力就能过了.......请问是有复杂度保证么

write answer 切换为英文 切换为中文


转发分享