Submission #588586

#TimeUsernameProblemLanguageResultExecution timeMemory
588586leeh18XOR (IZhO12_xor)C++17
100 / 100
577 ms59396 KiB
#include <bits/stdc++.h> using namespace std; struct trie_node { int max_idx; array<unique_ptr<trie_node>, 2> children; trie_node() : max_idx(0) {} void insert(int x, int idx, int pos = 30) { if (pos < 0) return; int bit = (x >> pos) & 1; if (children[bit] == nullptr) { children[bit] = make_unique<trie_node>(); } children[bit]->max_idx = max(children[bit]->max_idx, idx); children[bit]->insert(x, idx, pos-1); } bool check(int bit, int k) { if (children[bit] == nullptr) return false; return children[bit]->max_idx >= k; } int max_xor(int x, int k, int pos = 30) { if (pos < 0) return 0; int ret = 0; int bit = (x >> pos) & 1; if (check(bit^1, k)) { ret = children[bit^1]->max_xor(x, k, pos-1); ret |= (1 << pos); } else { ret = children[bit]->max_xor(x, k, pos-1); } return ret; } }; int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); int n, x; cin >> n >> x; vector<int> psum(n + 1); for (int i = 1; i <= n; i++) { cin >> psum[i]; psum[i] ^= psum[i - 1]; } trie_node trie; for (int i = 0; i <= n; i++) { trie.insert(psum[i], i); } int ans_i = 0, ans_k = 0; for (int i = 0; i < n; i++) { int lo = i, hi = n; while (lo < hi) { int mid = (lo + hi + 1) / 2; if (trie.max_xor(psum[i], mid) >= x) lo = mid; else hi = mid - 1; } int k = lo - i; if (ans_k < k) { ans_i = i + 1; ans_k = k; } } cout << ans_i << ' ' << ans_k << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...