T1. 阿斯

\(k = \lceil\log_2 n\rceil\)\(M = 2^{k+1}-1\)

首先我们试图构造一个异或和为 \(M\) 的集合 \(S\)

  1. 如果 \(u \oplus v = M\),则 \(\{u, v\}\) 合法
  2. 否则令 \(w = u \oplus v \oplus M\)。如果 \(w \leqslant n\) 且不为 \(u, v\),则 \(\{u, v, w\}\) 合法
  3. 否则试图寻找 \(x, y\) 使得 \(x \oplus y = w\)。从小到大枚举 \(x\) 以获得字典序最小的 \(\{u, v, x, y\}\)
    \(n \geqslant 2^k+2\) (且 \(k \geqslant 2\))时,该操作一定成功:\((2^k, 2^k \oplus w)\)\((2^k+1, (2^k+1) \oplus w)\)\((2^k+2, (2^k+2) \oplus w)\) 中一定存在至少一对合法的 \((x, y)\)
  4. 若上述操作失败,则 \(n \leqslant 5\)\(n = 2^k\)\(n = 2^k+1\)。我们对此进行分类讨论:
  • \(n \leqslant 5\):暴力即可
  • \(n = 2^k\)
    步骤2失败意味着 \(w > n\)\(u, v < n\)
    考虑到步骤3中唯一一组可以尝试的解是 \((2^k, 2^k \oplus w)\),所以步骤3失败意味着 \(u\)\(v\) 等于 \(2^k \oplus w\)
    不妨设 \(u = 2^k \oplus w\),可得 \(v = M \oplus u \oplus w = 2^k-1\)
    所以,\(\{u, v, 2^k, 1, u \oplus 1\}\)\(\{u, v, 2^k, 2, u \oplus 2\}\) 中必定存在一个合法解
  • \(n = 2^k+1\)
    经过类似的分析,上述操作全部失败意味着:
    • \(\{u, v\} = \{2^k-1, 2^k-2\}\):则 \(\{u, v, 2, 2^k, 2^k-3\}\) 是字典序最小的合法解
    • \(\{u, v\} = \{2^k, 2^k+1\}\):此时不存在异或和为 \(M\) 的解。可以取到的最大异或和为 \(2^k-1\),方案为 \(\{u, v, 2^k-2\}\)

T2. 特尔

首先不妨对 \(a\) 重排。这显然对答案没有影响。

对于下标 \(i\),如果 \(b_i\) 是前缀最小值,那么我们称 \(i\) 这个位置是最小值,否则称其为最大值(如果同时是两者则钦定它为最小值)。

我们枚举 \(b\) 中有多少个位置是最小值。设有恰好 \(m\) 个位置是最小值,那么填数的方案一定是:从 \(n\) 个下标中选出 \(m\) 个,按照 \(a_m, a_{m-1}, \cdots, a_1\) 的顺序填入,作为最小值,再按照 \(a_{m+1}, a_{m+2}, \cdots, a_n\) 的顺序在剩下的位置填入,作为最大值。

但是这样做不一定会得到一个合法方案:如果 \(a_{m+1}\) 前面没有严格小于它的数,那么 \(a_{m+1}\) 就会表现为一个最小值,使得最小值的个数并不恰好为 \(m\)。所以,\(a_{m+1}\) 前面必须有至少一个严格小于它的数。设 \(i\) 为最大的使得 \(a_i < a_{m+1}\) 的下标,那么 \(a_{m+1}\) 前面必须包含 \(a_{m}, a_{m-1}, \cdots, a_i\) 这些数。

于是我们得出:一个方案合法且恰好有 \(m\) 个最小值,当且仅当这个方案中,\(b\) 的前缀是 \(\{a_m, a_{m-1}, \cdots, a_i\}\)。如果 \(i\) 不存在(即 \(a_{m+1} = a_1\)),那么这样的合法方案也不存在。
由于剩下的位置可以任选,所以这样的合法方案数量是 \(\binom{n-m+i-1}{i-1}\)
复杂度为 \(O(n)\)

T3. 伊思穆

考虑一个dp:设 \(f(i)\) 为将 \(S_{1 \cdots i}\) 切成好串的最小切分次数,则有 \(f(i) = \min\{ f(j) \} + 1\),其中 \(j < i\)\(S_{(j+1) \cdots i}\) 是一个好串。然后考虑如何进行转移。

首先我们将 \(a \cdots t\) 映射到 \(2^0 \cdots 2^{19}\),然后设 \(\{a_i\}\) 为映射后的数组,\(\{b_i\}\)\(\{a_i\}\) 的前缀异或和数组。

可以观察到,对于一个 \(i\) 和任意的 \(j \leqslant i\)\(\{a_j, \cdots , a_i\}\) 中最多只有 \(20\) 种不同的值,且这些值把 \([1, i]\) 切成了若干个子区间。每一个子区间内的所有 \(j\) 对应了一个取值,且不同的区间对应不同的取值。

我们考虑其中一个子区间 \([l, r]\) 和其中的一个下标 \(j \in [l, r]\),并令 \(M = a_j \vee \cdots \vee a_i\)(这个值对于所有的 \(j\) 均相等)。注意到 \(S_{j \cdots i}\) 是好串当且仅当 \(b_{j-1} \oplus b_i = M\),所以这个区间里所有形如 \(S_{l \cdots r}\) 的好串均满足 \(b_{j-1} = b_j \oplus M\)。这使我们得到一个解法:

  • 枚举 \(i = 1, \cdots, n\)
    • 枚举上文所述的区间 \([l, r]\) (这样的区间只有 \(20\) 个)
      • 计算 \(M = a_j \vee \cdots \vee a_i\)
      • 找到所有满足 \(j \in [l, r]\)\(b_{j-1} = b_i \oplus M\) 的下标 \(j\),并计算出 \(\min\{f(j)\}\) (*)
      • \(f(i) \gets \min\{ f(j) \} + 1\)

对于标 (*) 的这一步,我们可以先预处理出所有的 \(b_i\),然后对于每一种 \(b_i\) 的值,对取这些值的下标建一颗树,这样 (*) 这一步的查询就可以变成一个普通的RMQ查询,于是可以用线段树解决。
时间复杂度为 \(O(n|\Sigma|\log n)\),其中 \(|\Sigma| = 20\),可以通过本题。