제출 #1017194

#제출 시각아이디문제언어결과실행 시간메모리
1017194ind1vXOR (IZhO12_xor)C++11
100 / 100
103 ms90408 KiB
#include <bits/stdc++.h> using namespace std; const int N = 250005; const int L = 30; int n, x; struct trie { struct node { int nxt[2]; int mn; node() { memset(nxt, -1, sizeof(nxt)); mn = 1e9; } } t[L * N]; int nd = 0; int new_node() { nd++; return nd; } trie() { new_node(); } int que(int v) { int p = 1; int mn = 1e9; for (int i = L - 1; i >= -1; i--) { if (i == -1) { mn = min(mn, t[p].mn); break; } int j = (v >> i & 1); int bit = (x >> i & 1); if (bit == 0) { if (j > (x >> i & 1)) { if (t[p].nxt[0] != -1) { mn = min(mn, t[t[p].nxt[0]].mn); } if (t[p].nxt[1] != -1) { p = t[p].nxt[1]; } else { break; } } if ((1 ^ j) > (x >> i & 1)) { if (t[p].nxt[1] != -1) { mn = min(mn, t[t[p].nxt[1]].mn); } if (t[p].nxt[0] != -1) { p = t[p].nxt[0]; } else { break; } } } else if (bit == 1) { if (t[p].nxt[j ^ 1] != -1) { p = t[p].nxt[j ^ 1]; } else { break; } } } return mn; } void add(int v, int y) { int p = 1; for (int i = L - 1; i >= 0; i--) { int j = (v >> i & 1); if (t[p].nxt[j] == -1) { t[p].nxt[j] = new_node(); } t[t[p].nxt[j]].mn = min(t[t[p].nxt[j]].mn, y); p = t[p].nxt[j]; } } }; trie tr; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> x; int xr = 0; tr.add(0, 0); int al = -1, ar = -1, ln = -1e9; for (int i = 1; i <= n; i++) { int a; cin >> a; xr ^= a; int l = tr.que(xr); if (i - l > ln) { al = l + 1; ar = i; ln = i - l; } tr.add(xr, i); } cout << al << ' ' << ar - al + 1 << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...