需要对若干序列按权值排序,序列 \(\lang a\rang\) 由 \(2,3\) 构成,权值是
\[w(\lang a\rang)=a_1^{a_2^{a_3...}} \]引理 \(1\):当 \(k\ge 4\) 时满足
\[\forall i,w(\langle\underbrace{2,2,2,\dots 2}_{i \text{个}} ,kx \rangle)>w(\langle\underbrace{3,3,3,\dots 3}_{i \text{个}} ,x \rangle) \]证明容易。
推论:长度差大于 \(1\) 的序列直接可以按长度比较大小。
引理 \(2\):
\[\forall u\neq v\in \{w(\lang a_1,a_2,a_3,a_4\rang)\mid a_i\in \{2,3\}\}\\ \frac uv\not\in [\frac 14,4]\]- This is proved by C++。
因此,有定理:
以下的比较方法是正确的:
-
先判掉长度差大于 \(1\) 的序列。
-
对于长度差等于 \(1\) 的序列,把长的序列最后两个数取幂合并,比较后四个数的幂塔大小即可。
-
对于长度相等的序列,找出最长公共后缀,如果长度大于 \(1\) 就直接比较最后一个不同的位置,否则比较不同的后四个位置(带上公共后缀)的幂塔。
直接快速排序+SA 就是 \(O(n\log n)\) 的。注意到长度相等的序列在快排中暴力找最长公共后缀的复杂度正确,不需要使用后缀数组
标签:lang,rang,后缀,闲话,7.6,序列,长度 From: https://www.cnblogs.com/british-union/p/18287318/76xh