AND XOR
题号:NC316175
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}给定一个长度为 n 的非负整数数组 a_1, a_2, \dots, a_n
\hspace{15pt}你需要将这个数组划分成若干个连续的非空子段,使得每一个子段都满足以下条件:
\hspace{23pt}\bullet\,对于该子段内的所有元素,它们的按位与^\texttt{[1]}结果必须严格大于它们的按位异或^\texttt{[2]}结果。
\hspace{15pt}请问最多可以将数组划分为多少个合法的子段?如果无论如何划分都无法让所有子段满足条件,请输出 -1

【名词解释】
\hspace{15pt}按位与(Bitwise AND)^\texttt{[1]}:对多个整数的二进制表示按位进行与运算。
\hspace{15pt}按位异或(Bitwise XOR)^\texttt{[2]}:对多个整数的二进制表示按位进行异或运算。

输入描述:

\hspace{15pt}第一行输入一个整数 n \left(1 \le n \le 3 \times 10^5 \right),表示数组中的元素数量。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n \left(0 \le a_i < 2^{30} \right),表示数组。

输出描述:

\hspace{15pt}输出一个整数,表示最多能够划分出的合法子段数;若无法划分,输出 -1
示例1

输入

复制
4
3 3 2 3

输出

复制
2
示例2

输入

复制
6
1 3 3 1 2 2

输出

复制
2
示例3

输入

复制
8
7 5 15 15 1 3 7 5

输出

复制
3

备注:

\hspace{15pt}在几乎全部的情况下,PyPy 的运行速度优于 Python,我们建议您选择对应版本的 PyPy 进行提交、而不是 Python。