제출 #1318867

#제출 시각아이디문제언어결과실행 시간메모리
1318867keroXOR (IZhO12_xor)C++20
100 / 100
120 ms58480 KiB
#include <bits/stdc++.h> using namespace std; struct Node { Node* child[2]; int minIdx; Node() { child[0] = child[1] = nullptr; minIdx = INT_MAX; } }; void insert(Node* root, int val, int idx) { Node* cur = root; for (int b = 30; b >= 0; b--) { int bit = (val >> b) & 1; if (!cur->child[bit]) cur->child[bit] = new Node(); cur = cur->child[bit]; cur->minIdx = min(cur->minIdx, idx); } } int query(Node* root, int val, int x) { Node* cur = root; int res = INT_MAX; for (int b = 30; b >= 0; b--) { if (!cur) break; int vb = (val >> b) & 1; int xb = (x >> b) & 1; if (xb == 0) { if (cur->child[1 - vb]) res = min(res, cur->child[1 - vb]->minIdx); cur = cur->child[vb]; } else { cur = cur->child[1 - vb]; } } if (cur) res = min(res, cur->minIdx); return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; int x; cin >> N >> x; vector<int> a(N + 1), pref(N + 1, 0); for (int i = 1; i <= N; i++) { cin >> a[i]; pref[i] = pref[i - 1] ^ a[i]; } Node* root = new Node(); insert(root, 0, 0); int bestLen = 0; int bestL = 1; for (int r = 1; r <= N; r++) { int j = query(root, pref[r], x); if (j != INT_MAX) { int len = r - j; if (len > bestLen) { bestLen = len; bestL = j + 1; } } insert(root, pref[r], r); } cout << bestL << " " << bestLen << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...