观察:如果先做 AND 再做 OR,一定不如先做 OR 再做 AND。证明只需枚举所有情况。
现在问题转化为把数组分成尽可能少的段,使得每一段的 OR 的 AND 等于 $0$。考虑 DP,令 $f(i,x)$ 表示把前 $i$ 个数分成若干段,当前的 AND 是 $x$ 时最少的段数。暴力转移是 $O(N^2V)$ 时间。
注意到转移是把 $x$ 和 $A_{i+1}\operatorname{or}\cdots\operatorname{or} A_{j}$ 取 AND,后者对于固定的 $i$ 只有 $\log V+1$ 段,对于每一段和给定的 $x$,转移相当于对于 $r,y$ 把所有满足 $i< j\le r$ 的 $f(j,y)$ 对 $f(i,x)+1$ 取较小值。这样的转移可以用一个数组 $g(x,v)$ 表示所有满足 $i< j\le g(x,v)$ 的 $f(j,x)$ 对 $v$ 取较小值。注意到如果有解,则答案不超过 $2\log V+1$,因为我们可以找到 $\log V$ 个数,把这些数单独分成一段。因此 $v$ 也只有 $O(\log V)$ 级别,从而我们可以在 $O(\log V)$ 的时间内得到一个位置的 DP 值 $f(i,x)$。总时间复杂度 $O(NV\log V)$。
要进一步优化,首先考虑我们可以认为 $f(i+1,x)\le f(i,x)+1$,这是因为我们可以把 $A_{i+1}$ 单独分成一段,虽然可能会使得 $x$ 的位数变小,但是我们认为 $x$ 保持不变不会使得答案变得更小。这样我们就可以 $O(1)$ 得到每个位置的 DP 值。其次,考虑 $A_{i+1}\operatorname{or}\cdots\operatorname{or} A_{j}$ 的 $\log V+1$ 段,我们按照从后往前的顺序处理,每一段是让每个 $x$ 转移到 $x\operatorname{and} y$,这里 $y$ 二进制中 $1$ 的个数不断减小,而对于 $y$ 二进制中等于 $0$ 的位,我们不需要知道 $x$ 对应的位是多少,因此可以直接每次压缩掉 DP 数组中减少的那一位,从而时间复杂度变为 $\sum_{i=0}^{\log V}O(2^i)=O(V)$。总时间复杂度 $O(NV)$。
一个更简单的做法是,发现固定 $j,x$ 之后,形如 $f(i,x)\to f(j,y)$ 的转移,只有 $i$ 这一维的后缀最小值有用,因为如果区间更长且答案更大,则一定不优。而我们可以假设对任意的 $j>i$ 都有 $f(j,x)\le f(i,x+1)$,原因和上面一致。所以事实上后缀最小值不超过两个,因此容易做到 $O(NV)$ 时间复杂度。