数组最大前缀后缀异或
描述
给一个长度为n的整数序列,现在要你截取这个序列的一个前缀和一个后缀(前缀和后缀不能相交),使得前缀和后缀的异或值最大。
给一个长度为n的整数序列,现在要你截取这个序列的一个前缀和一个后缀(前缀和后缀不能相交),使得前缀和后缀的异或值最大。
前缀和后缀可以为空,为空时他们的值为0。
input
有多组测试数据,请处理到文件结束。
对于每组测试数据,第一行包含一个整数n(1<=n<=100 000)。
接下来一行有n个用空格隔开的整数a1, a2, a3, …, an (0 <= ai <= 1000 000 000 000)。
output
对于每组测试数据输出一行,保包含一个整数,表示异或的最大的值。
sample input
2
1 2
3
1 2 3
2
1000 1000
sample output
3
3
1000
分析
因为两个相同的值异或为0,那么以 1 2 4 8 16 为例
如果 1 2 4 8为前缀, 4 8 16为后缀,他们是有交叉的,但由于异或的性质,他与 前缀1 2和后缀 16等价,因为中间相同的部分异或为0.
即 1^2^4^8^4^8^16 =1^2^16 。
这样我们先对所有前缀插入字典树,然后对于每一个后缀来查找,求出最大值即可。
即使交叉也无所谓,不会影响最后的结果,只是计算的复杂度有所增加。
注意这里的search函数里求result的方法
为了预防多次测试trie树没有清空造成错误,可以每次在while循环内部实例化root
1 |
|