Input
单组测试数据。
第一行有一个整数n (1 < n ≤ 10^5)。
第二行包含n个不同的整数 s1, s2, ..., sn (1 ≤ si ≤ 10^9)。
Output
输出所有子段的最大幸运值。
Input示例
5
5 2 1 4 3
5
9 8 3 5 7
Output示例
7
15
思路:
利用单调递减栈。在一个方向判断完最大值在次大值之后的情况,然后需要翻转再判断一次最大值在次大值之前的情况。
#include <iostream>
#include <stack>
#include <stdio.h>
using namespace std;
const int MAXN = 1e5 + 10;
int input[MAXN];
int n;
stack<int> buf;
int result = 0;
void fun()
{
while (!buf.empty())
{
buf.pop();
}
buf.push(input[0]);
for (int i = 1; i < n; i++)
{
while (!buf.empty() && input[i] > buf.top())
{
result = max(result, input[i] ^ buf.top());
buf.pop();
}
buf.push(input[i]);
}
}
int main()
{
while (scanf("%d", &n) != -1)
{
result = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &input[i]);
}
fun();
int left = 0;
int right = n - 1;
while (left < right)
{
swap(input[left], input[right]);
left++;
right--;
}
fun();
cout << result << endl;
}
return 0;
}