#include <cstring> #include <cstdio> #include <algorithm> const int MAXN = 110000; namespace trie { struct Node { int ch[2]; int id; } d[MAXN*35]; int tot = 0; inline int newNode () { memset(d+(++tot), 0, sizeof d[0]); return tot; } inline void insert(int val, int id) { //printf("ins:%d\n", val); int mask = 1<<29, u = 0, t; d[u].id = id; while(mask) { t = bool(val&mask); if(!d[u].ch[t]) d[d[u].ch[t] = newNode()].id = id; else d[d[u].ch[t]].id = id; u = d[u].ch[t]; mask >>= 1; } } inline int query(int val) { int mask = 1<<29, u = 0, t; while(mask) { t = !(bool(val&mask)); if(!d[u].ch[t]) u = d[u].ch[!t]; else u = d[u].ch[t]; mask >>= 1; } return d[u].id; } } inline int getInt() { int ret = 0; char ch; bool f = false; while((ch = getchar()) < '0' || ch > '9') f |= (ch == '-'); do{ret *= 10; ret += ch - '0';} while((ch = getchar()) >= '0' && ch <= '9'); return f ? -ret : ret; } int nums[MAXN]; int pref[MAXN]; int main() { int n; n = getInt(); for(int i = 1; i<=n; i++) nums[i] = getInt(); int ans = 0, l, r; for(int i = 1; i<=n; i++) pref[i] = pref[i-1]^nums[i]; trie :: insert(0, 0); r = 1; for(int i = 1; i<=n; i++) { int lp = trie :: query(pref[i]); //printf("p:%d q:%d\n", i, lp); if((pref[lp]^pref[i]) > ans) { ans = pref[lp]^pref[i]; l = lp; r = i; } trie :: insert(pref[i], i); } printf("%d %d %d\n", ans, l+1, r); }
点赞 1

相关推荐

牛客网
牛客企业服务