题目描述
给定一个长度为 n 的序列 a1,a2,…an。
你可以对这个序列进行若干(可能为 0)次操作。在每次操作中,你将会:
- 选择三个正整数 i<j<k,满足 ai⊕aj⊕ak=0 且 k 的值不超过此时序列的长度。记 s=ai⊕ai+1⊕⋯⊕ak。
- 然后,删除 ai∼ak,并在原来这 k−i+1 个数所在的位置插入 s。注意,此时序列 a 的长度将会减少 (k−i)。
请你判断是否能够使得序列 a 仅剩一个数,也就是说,在所有操作结束后 a 的长度为 1。若可以,你还需要给出一种操作方案。
输入格式
从标准输入读入数据。
本题含有多组测试数据。
输入的第一行包含一个正整数 T,表示数据组数。
对于每组测试数据,第一行一个正整数 n,表示初始序列长度。
第二行 n 个整数 a1,a2,…,an,表示初始序列中每个元素的值。
输出格式
对于每组测试数据:
- 若存在一种方案使得序列 a 仅剩一个数,请在输出的第一行输出
Huoyu
。
- 接下来,在第二行你应该输出一个非负整数 t,表示你的操作次数。你需要保证 0≤t≤n。
- 接下来 t 行,每行输出三个正整数 i,j,k,表示你在这次操作中选择的三个数的值。你需要保证 i<j<k 且 k 的值不超过此时序列的长度。
- 否则,请输出一行一个字符串
Shuiniao
。
2
5
3 3 1 4 5
9
3 4 6 5 4 5 1 2 4
Huoyu
2
3 4 5
1 2 3
Huoyu
3
1 3 4
2 3 4
1 2 4
提示
【样例解释 #1】
对于第一组测试数据:
- 第一次操作中,a3⊕a4⊕a5=1⊕4⊕5=0,操作后的序列为 [3,3,0];
- 第二次操作中,a1⊕a2⊕a3=3⊕3⊕0=0,操作后的序列为 [0]。
于是,序列 a 在两次操作后仅剩一个数。
对于第二组测试数据:
- 第一次操作,a1⊕a3⊕a4=3⊕6⊕5=0,s=4,操作后的序列为 [4,4,5,1,2,4]。
- 第二次操作,a2⊕a3⊕a4=4⊕5⊕1=0,操作后的序列为 [4,0,2,4]。
- 第三次操作,a1⊕a2⊕a4=4⊕0⊕4=0,s=2,操作后的序列为 [2]。
于是,序列 a 在三次操作后仅剩一个数。
【样例 #2】
见选手目录下的 merge/merge2.in
与 merge/merge2.ans
。
这个样例满足测试点 6∼7 的条件限制。
【样例 #3】
见选手目录下的 merge/merge3.in
与 merge/merge3.ans
。
这个样例满足测试点 12∼13 的条件限制。
【数据范围】
对于所有数据保证:1≤T≤20,1≤n≤500,0≤ai<512。
测试点编号 |
n |
∑n≤ |
ai< |
1 |
=1 |
20 |
512 |
2 |
=2 |
40 |
3 |
=3 |
60 |
4 |
=4 |
80 |
5 |
=5 |
100 |
6∼7 |
≤40 |
800 |
8∼9 |
≤70 |
1 400 |
10∼11 |
≤130 |
2 600 |
12∼13 |
≤300 |
6 000 |
128 |
14∼15 |
≤500 |
3 000 |
64 |
16∼17 |
128 |
18∼20 |
10 000 |
512 |
【提示】
⊕ 表示按位异或运算。
请对程序的常数以及效率给予充分的信任。