题目链接
题意:给定一个数组,定义一个区间【l,r】的值为这个区间的最大值异或次大值,求这个结果的最大值。
思路:同样也是用单调栈来维护,对于弹出去的元素我们就认为它是当前区间的次大值。当不能再弹的时候,那么自己就是次大值了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
stack<int>s;
int n,a[maxn],ans=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
while(!s.empty()&&a[s.top()]<a[i]) ans=max(ans,a[s.top()]^a[i]),s.pop();
if(!s.empty()) ans=max(ans,a[s.top()]^a[i]);
s.push(i);
}
printf("%d\n",ans);
}