奶牛异或
思路
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 1e5 + 10; int tr[maxn][2], cnt; int r[maxn]; int n; int XOR[maxn]; void add(int x, int pos){ int cur = 0; for(int i = 30; i >= 0; i--){ int f = (x >> i) & 1; if(!tr[cur][f]) tr[cur][f] = ++cnt; cur = tr[cur][f]; } r[cur] = pos; } pii query(int x){ int cur = 0; pii ans; for(int i = 30; i >= 0; i--){ int f = (x >> i) & 1; f ^= 1; if(!tr[cur][f]) f ^= 1; else ans.first += 1 << i; cur = tr[cur][f]; } ans.second = r[cur]; return ans; } int main(){ scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%d", &XOR[i]); XOR[i] ^= XOR[i - 1]; } int ans = XOR[1]; int L, R; L = R = 1; for(int l = n; l >= 1; l--){ add(XOR[l], l); pii k = query(XOR[l - 1]); if(k.first > ans){ ans = k.first; R = k.second; L = l; } else if(k.first == ans){ if(k.second == R) L = max(L, l); else if(k.second < R){ L = l; R = k.second; } } } printf("%d %d %d\n", ans, L, R); return 0; }