「KDOI-06-S」合并序列
题目描述
给定一个长度为 $n$ 的序列 $a_1,a_2,\ldots a_n$。
你可以对这个序列进行若干(可能为 $0$)次操作。在每次操作中,你将会:
* 选择三个正整数 $i<j<k$,满足 $a_i\oplus a_j\oplus a_k=0$ 且 $k$ 的值不超过此时序列的长度。记 $s=a_i\oplus a_{i+1}\oplus \cdots\oplus a_k$。
* 然后,删除 $a_i\sim a_k$,并在原来这 $k-i+1$ 个数所在的位置插入 $s$。注意,此时序列 $a$ 的长度将会减少 $(k-i)$。
请你判断是否能够使得序列 $a$ 仅剩一个数,也就是说,在所有操作结束后 $a$ 的长度为 $1$。若可以,你还需要给出一种操作方案。
输入输出格式
输入格式
从标准输入读入数据。
**本题含有多组测试数据。**
输入的第一行包含一个正整数 $T$,表示数据组数。
对于每组测试数据,第一行一个正整数 $n$,表示初始序列长度。
第二行 $n$ 个整数 $a_1,a_2,\ldots,a_n$,表示初始序列中每个元素的值。
输出格式
对于每组测试数据:
+ 若存在一种方案使得序列 $a$ 仅剩一个数,请在输出的第一行输出 `Huoyu`。
+ 接下来,在第二行你应该输出一个非负整数 $t$,表示你的操作次数。你需要保证 $0\le t\le n$。
+ 接下来 $t$ 行,每行输出三个正整数 $i,j,k$,表示你在这次操作中选择的三个数的值。你需要保证 $i<j<k$ 且 $k$ 的值不超过此时序列的长度。
+ 否则,请输出一行一个字符串 `Shuiniao`。
输入输出样例
输入样例 #1
2
5
3 3 1 4 5
9
3 4 6 5 4 5 1 2 4
输出样例 #1
Huoyu
2
3 4 5
1 2 3
Huoyu
3
1 3 4
2 3 4
1 2 4
说明
**【样例解释 #1】**
对于第一组测试数据:
* 第一次操作中,$a_3\oplus a_4\oplus a_5=1\oplus4\oplus5=0$,操作后的序列为 $[3,3,0]$;
* 第二次操作中,$a_1\oplus a_2\oplus a_3=3\oplus3\oplus0=0$,操作后的序列为 $[0]$。
于是,序列 $a$ 在两次操作后仅剩一个数。
对于第二组测试数据:
* 第一次操作,$a_1\oplus a_3\oplus a_4=3\oplus6\oplus5=0$,$s=4$,操作后的序列为 $[4,4,5,1,2,4]$。
* 第二次操作,$a_2\oplus a_3\oplus a_4=4\oplus5\oplus1=0$,操作后的序列为 $[4,0,2,4]$。
* 第三次操作,$a_1\oplus a_2\oplus a_4=4\oplus0\oplus4=0$,$s=2$,操作后的序列为 $[2]$。
于是,序列 $a$ 在三次操作后仅剩一个数。
**【样例 #2】**
见选手目录下的 `merge/merge2.in` 与 `merge/merge2.ans`。
这个样例满足测试点 $6\sim7$ 的条件限制。
**【样例 #3】**
见选手目录下的 `merge/merge3.in` 与 `merge/merge3.ans`。
这个样例满足测试点 $12\sim13$ 的条件限制。
**【数据范围】**
对于所有数据保证:$1\leq T\leq20$,$1\leq n\leq500$,$0\leq a_i<512$。
| 测试点编号 | $n$ | $\sum n\leq$ | $a_i<$ |
|:--:|:--:|:--:|:--:|
| $1$ | $=1$ | $20$ | $512$ |
| $2$ | $=2$ | $40$ | $512$ |
| $3$ | $=3$ | $60$ | $512$ |
| $4$ | $=4$ | $80$ | $512$ |
| $5$ | $=5$ | $100$ | $512$ |
| $6\sim7$ | $\leq40$ | $800$ | $512$ |
| $8\sim9$ | $\leq70$ | $1~400$ | $512$ |
| $10\sim11$ | $\leq130$ | $2~600$ | $512$ |
| $12\sim13$ | $\leq300$ | $6~000$ | $128$ |
| $14\sim15$ | $\leq500$ | $3~000$ | $64$ |
| $16\sim17$ | $\leq500$ | $3~000$ | $128$ |
| $18\sim20$ | $\leq500$ | $10~000$ | $512$ |
**【提示】**
$\oplus$ 表示按位异或运算。
**请对程序的常数以及效率给予充分的信任。**