Round #172 (Div. 2) D. Maximum Xor Secondary——栈的高级应用消除冗余操作

题意:给出一个元素互不相同的序列,求所有子段的最大值和次大值的异或值中的最大值。

我们从最直接的方法开始考虑,枚举所有的子段:先沿着序列从前向后枚举子段的结束的位置,对于每一个结束位置,向前枚举子段开始的位置,动态更新最大值和次小值。这样的做法是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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值