开心消消乐(Right Version)
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定一个长度为 N 的序列 \{a_i\},序列中第 i 个数字为 a_i,你可以对序列执行若干次操作,每次操作选定两个数字l, r(1 \le l \le r \le n),使得\forall i \in [l, r], a_i = a_i \bigoplus a_l。题目要求操作的顺序按照 l 严格单调递减的顺序进行操作。也就是说,假设一共执行了 T 次操作,第 i 次操作选定的数字为 l_i, r_i, 有 1 \le l_T < l_{T - 1} < \cdots < l_2 < l_1 \le n。求使得序列中的所有元素全部变成 0 所需的最少操作次数。

输入描述:

第一行,一个正整数 N (1 \le N \le 10^6) 表示序列长度
第二行,N 个用空格隔开的正整数表示序列\{a_i\}, 第 i 个正整数表示 a_i (0 \le a_i \le 10^6)

输出描述:

一行一个整数表示最少操作次数。
示例1

输入

复制
5
5 1 2 2 4

输出

复制
4

说明

操作依次为:
1. [5, 5],序列变为 5 1 2 2 0
2. [3, 4]序列变为 5 1 0 0 0
3. [2, 2]序列变为 5 0 0 0 0
4. [1, 1]序列变为 0 0 0 0 0