题意:给出一个元素互不相同的序列,求所有子段的最大值和次大值的异或值中的最大值。
我们从最直接的方法开始考虑,枚举所有的子段:先沿着序列从前向后枚举子段的结束的位置,对于每一个结束位置,向前枚举子段开始的位置,动态更新最大值和次小值。这样的做法是O(n^2),我们再来看看冗余的操作:对于每一个结束位置,在枚举开始位置的时候,一旦枚举到开始位置的元素的值比结束位置大的时候,就可以停止枚举进入下一个开始位置了。我们可以维护一个栈:对每个结束位置上的元素,不断的比较其和栈顶元素的大小并叫栈顶元素弹出知道栈为空或栈顶元素的值大于待入栈的元素,同时计算该元素和栈顶元素的异或值,最后将其压入栈中,进入下一个结束位置。
n = input()
num = map(int, raw_input().split())
sta, res = [], -1
sta.append(num[0])
for i in range(1, n):
while sta:
res = (num[i] ^ sta[-1]) if (num[i] ^ sta[-1]) > res else res
#print num[i], sta[-1], res
if sta[-1] > num[i]: break
else: sta.pop()
sta.append(num[i])
print res
本文介绍一种求解序列中所有子段的最大值和次大值异或最大值的高效算法。通过枚举子段结束位置,并使用栈来动态更新最大值与次大值,避免重复计算,实现O(n)的时间复杂度。

被折叠的 条评论
为什么被折叠?



