小苯的数字变换
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
64bit IO Format: %lld

题目描述

\hspace{15pt}小苯最近在研究一种新型的数字变换游戏,名为“数字螺旋”。给定一个长度为 n 的数字序列 a_1, a_2, \dots, a_n,数字螺旋的生成规则如下:
\hspace{23pt}\bullet\,任意选择一个数字 a_i,将其替换为 a_i \oplus \lfloor\tfrac{a_i}{2}\rfloor
\hspace{23pt}\bullet\,目标是通过最少的操作次数,使得整个序列变成一个回文序列
\hspace{15pt}现在,小苯需要你帮助他计算出最少需要的操作次数。如果无法达成目标,则输出 -1

【名词解释】
\hspace{15pt}按位异或(\oplus:对两个整数的二进制表示按位按位异或运算。
\hspace{15pt}\lfloor x \rfloor:代表对 x 进行下取整操作,得到不超过 x 的最大整数。
\hspace{15pt}回文序列:一个序列被称作回文序列,当且仅当这个序列从左往右读和从右往左读是相同的。换句话说,对于任意的 1 \leqq i \leqq n,均有 a_i = a_{n-i+1} 成立。

输入描述:

\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 10^5\right) 代表数据组数,每组测试数据描述如下:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 5\times 10^5\right),表示数字序列的长度。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n\left(0\leqq a_i \lt 2^{31}\right)
\hspace{15pt}除此之外,保证单个测试文件的 n 之和不超过 5\times 10^5

输出描述:

\hspace{15pt}对于每一组测试数据,新起一行。如果不存在答案,在一行上输出固定的整数 -1;否则,输出一个整数,表示最少需要的操作次数。
示例1

输入

复制
3
4
6 2 3 4
5
5 10 15 10 5
2
1 10

输出

复制
2
0
-1

说明

\hspace{15pt}对于第一组测试数据,初始序列为 \{6, 2, 3, 4\}。可以通过以下操作使其变为回文序列: 
\hspace{23pt}\bullet\,a_2 变换为 2 \oplus \lfloor\tfrac{2}{2}\rfloor = 3,序列变为 \{6, {\color{orange}{3}}, 3, 4\}
\hspace{23pt}\bullet\,a_4 变换为 4 \oplus \lfloor\tfrac{4}{2}\rfloor = 6,序列变为 \{6, 3, 3, {\color{orange}{6}}\}
\hspace{15pt}此时序列已经是回文序列。我们可以证明,至少需要 2 次操作。

\hspace{15pt}对于第二组测试数据,初始序列已经是回文序列,无需操作。

\hspace{15pt}对于第三组测试数据,不存在任何解。