链接:https://www.nowcoder.com/questionTerminal/872919272a33406a9c5ddc8b2f7532f4 来源:牛客网
牛牛得到一个长度为n的整数序列V,牛牛定义一段连续子序列的幸运值为这段子序列中最大值和次大值的异或值(次大值是严格的次大)。牛牛现在需要求出序列V的所有连续子序列中幸运值最大是多少。请你帮帮牛牛吧。
输入描述:
第一行一个整数n,即序列的长度。(2<= n <= 100000)
第二行n个数,依次表示这个序列每个数值V[i], (1 ≤ V[i] ≤ 10^8)且保证V[1]到V[n]中至少存在不同的两个值.
输出描述:
输出一个整数,即最大的幸运值
示例1
输入
5
5 2 1 4 3
输出
7
解题思路:针对每一个数,将其看作某连续子序列的次大值,找到最近的前后两个比其大的数作为最大值,求异或值。以5 2 1 4 3为例。
首先,将5看作次大值,往前找到第一个大于5的数,作为当前连续子序列的最大值,5前面没有数,找不到。然后,往后找到第一个大于5的数,找不到。
将2看作连续子序列的次大值,往前找到第一个大于2的数,5和2构成子序列的最大和次大值,异或值为7。往后找到第一个大于2的数,4和2构成子序列的最大和次大值,异或值为6。
将1看作连续子序列的次大值,往前找到第一个大于1的数,2和1构成子序列的最大和次大值,异或值为3。往后找到第一个大于1的数,4和1构成子序列的最大和次大值,异或值为5。
将4看作连续子序列的次大值,往前找到第一个大于4的数,5和4构成子序列的最大和次大值,异或值为1。往后找到第一个大于4的数,没有。
将3看作连续子序列的次大值,往前找到第一个大于3的数,4和3构成子序列的最大和次大值,异或值为7。往后找到第一个大于3的数,没有。
要求“最近”的原因是,以1为例,前面最近的一个大于1的数是2,在连续子序列 2 1中,2和1 分别构成最大值和次大值。若找到的是5,则在连续子序列5 2 1中,次大值便转移成了2,和1没什么关系了。
#include<iostream>
#include <vector>
using namespace std;
int main() {
int n,v;
cin >> n;
vector<int>vec;
cin >> v;
vec.push_back(v);
for (int i = 1; i < n; i++) {
cin >> v;
if( v != vec[vec.size()-1])//相邻的重复的数,只保留一个
vec.push_back(v);
}
//对于每一个数,分别往两边找到最近的一个大于它的数
int max = 0;
for (int i = 0; i < vec.size(); i++) {
for (int j = i - 1; j >= 0; j--){
if (vec[i] < vec[j]) {
int tmp_max = vec[i] ^ vec[j];
if (tmp_max > max) max = tmp_max;
break;
}
}
for (int k = i + 1; k < vec.size(); k++) {
if (vec[i] < vec[k]) {
int tmp_max = vec[k] ^ vec[i];
if (tmp_max > max) max = tmp_max;
break;
}
}
}
cout << max;
return 0;
}