Solution
设有雪顶和无雪顶的山的总高度差为 。
通过计算代表山峰类型的 矩阵的二维前缀和,可以求出每个大小为 的方形区域中,两种类型的山的数量差。设每个方形的数量差分别为 ,则问题转换为方程
对比朴素枚举,KMP 的思想是当匹配出现不一样的字符时,根据模式串当前子串的最大相同前后缀,将模式串的指针回退到最大相同前缀的末尾而非模式串的开头,从而优化时间复杂度。
记录子串最大相同前后缀长度的数组为 nexti。下图展示了 nexti 的求解过程。
set 和 multiset 作为 C++ STL 的一部分,由红黑树实现,能保持容器内元素始终有序。其插入、查找、删除的时间复杂度均为 Θ(logn)。两者区别在于 set 不允许有重复元素,multiset 允许有重复元素。
这里顺便提起 unordered_set 和 unordered_multiset,底层实现是哈希表,容器内元素无序。插入、查找、删除的时间复杂度最好为 Θ(1),最坏为 Θ(n)。空间换时间。