#P1016. 扩展数组

扩展数组

扩展数组

题目描述

给定一个长度为 nn 的整数数组 a1,a2,…,ana _ 1, a _ 2, \ldots, a _ n ,可以对该数组执行任意数量的操作。 在每次操作中,你可以选择两个相邻的元素 aia _ i 和 ai+1a _ {i+1} ( 1≤i<n1 \le i < n ),并在它们之间插入以下三个值之一: ai and ai+1a _ i \texttt{ and } a _ {i+1} 、 ai or ai+1a _ i \texttt{ or } a _ {i+1} 或 ai⊕ai+1a _ i \oplus a _ {i+1} 。 你的任务是确定数组在执行任意数量的操作后,最多可以存在多少个不同的值。

注意: x and yx \texttt{ and } y 表示 xx 和 yy 在二进制下的位与。 x or yx \texttt{ or } y 表示 xx 和 yy 在二进制下的位或。 x⊕yx \oplus y 表示 xx 和 yy 在二进制下的位 XOR(异或)。

与、或、异或运算真值表

A B A and B A or B A xor B
0 0 0 0
1 1 1
1 0
1 0

输入格式

第一行包含一个整数 nn ( 2≤n≤1052 \le n \le 10 ^ 5 ),表示数组的长度。 第二行包含 nn 个整数 a1,a2,…,ana _ 1, a _ 2, \ldots, a _ n ( 0≤ai<1090 \le a _ i < 10^9 ),表示数组的元素。

输出格式

输出一个整数,表示数组在执行任意数量的操作后,最多可以存在多少个不同的值。

样例 1

2
2 3
4

样例 2

2
3 4
4

提示

对于样例1,我们可以执行以下操作:

  1. 在下标 11 和 22 之间插入 2and3=22 \texttt{and} 3 = 2,数组变为 [2,2,3][2, 2, 3]。
  2. 在下标 11 和 22 之间插入 2⊕2=02 \oplus 2 = 0,数组变为 [2,0,2,3][2, 0, 2, 3]。
  3. 在下标 33 和 44 之间插入 2⊕3=12 \oplus 3 = 1,数组变为 [2,0,2,1,3][2, 0, 2, 1, 3]。

最终,数组中存在的不同值为 0,1,2,30, 1, 2, 3,共计 44 个不同的值。