CF 2172H Shuffling Cards with Problem Solver 68!
因为 \(t\) 很大,所以需要先尝试刻画下标 \(i\) 在一次变换后的新下标,然后去扩展到 \(t\) 次变换。
首先这个操作看着就带有一种“折半”的想法,所以可以尝试在二进制下分析,这也正好能和 \(2^k\) 契合。
如果按照 \(1\sim 2^k\) 编号就会多引入 \(k\) 这一位,看着不是很好看,所以应该把下标平移为 \(0\sim 2^k - 1\)。
可以看一下 \(k = 3\) 的表:\([0, 1, 2, 3, 4, 5, 6, 7]\to [0, 4, 1, 5, 2, 6, 3, 7]\)。
对着玩一玩应该就能找到对应的规律。
当然也是可以理性推导的,考虑分讨 \(i\) 二进制下的第 \(k - 1\) 位:
- 若为 \(1\),则 \(i\) 可以表示为 \(1\times 2^{k - 1} + x\),\(i\) 最后的位置是 \(2x + 1\)。
- 若为 \(0\),则 \(i\) 可以表示为 \(0\times 2^{k - 1} + x\),\(i\) 最后的位置是 \(2x\)。
经过分讨,可以看出规律就是 \(i\) 在一次变换后的新下标就是 \(i\) 二进制表示向高位循环移 \(1\) 位(第 \(k - 1\) 位变为第 \(0\) 位)的值。
那么就可以知道在 \(t\) 次变换后,下标 \(i\) 在初始状态的下标是 \(i\) 二进制表示向低位循环移 \(t\) 位的值。
接下来考虑求解最小字典序。
发现在这题的变换下,二进制下第 \(w\) 位会对应初始状态二进制第 \((w - t)\bmod k\) 位。
对于 \(t = 0\) 的情况,可以知道 \(p\) 开头的字符串下标就是 \(p, p + 2^0, p + 2^1, p + 2^1 + 2^0, \cdots\),这里的加法是在 \(\bmod 2^k\) 意义下的。
对于 \(t\not = 0\) 的情况,通过二进制位的变换关系可以知道,以 \(p\) 为开头变换后的字符串对应到初始状态的下标为 \(p, p + 2^{(0 - t)\bmod k}, p + 2^{(1 - t)\bmod k}, p + 2^{(0 - t)\bmod k} + 2^{(1- t)\bmod k}, \cdots\),依然是在 \(\bmod 2^k\) 下做的。
套用求解后缀数组的想法,可以划分成 \([p, p + 2^{(0 - t)\bmod k}], [(p + 2^{(1 - t)\bmod k}), (p + 2^{(1 - t)\bmod k}) + 2^{(0 - t)\bmod k}], \cdots\)。
那么就可以得出做法了,只需要把求解后缀数组的扩展顺序改为距离自己依次为 \(2^{(0 - t)\bmod k}, 2^{(1 - t)\bmod k}, 2^{(2 - t)\bmod k}\cdots\) 的下标即可。
整个过程是有点抽象的,可以对着 \(k = 3\) 玩一玩。
时间复杂度为 \(\mathcal{O}(2^k k)\)。

浙公网安备 33010602011771号