QY17. 幸运子序列
描述
牛牛得到一个长度为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
C++ 解法, 执行用时: 10ms, 内存消耗: 1692KB, 提交时间: 2020-10-29
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n = 0, ans = 0; cin >> n; vector<int> vv(n, 0); for(int i = 0; i < n; ++i) cin >> vv[i]; stack<int> st; for(int i = 0; i < n; ++i) { while(!st.empty() && st.top() <= vv[i]) ans = max(ans, vv[i] ^ st.top()), st.pop(); if(!st.empty()) ans = max(ans, vv[i] ^ st.top()); st.push(vv[i]); } cout << ans << '\n'; return 0; }
C++ 解法, 执行用时: 11ms, 内存消耗: 1692KB, 提交时间: 2020-07-28
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n = 0, ans = 0; cin >> n; vector<int> vv(n, 0); for(int i = 0; i < n; ++i) cin >> vv[i]; stack<int> st; for(int i = 0; i < n; ++i) { while(!st.empty() && st.top() <= vv[i]) ans = max(ans, vv[i] ^ st.top()), st.pop(); if(!st.empty()) ans = max(ans, vv[i] ^ st.top()); st.push(vv[i]); } cout << ans << '\n'; return 0; }