제출 #992987

#제출 시각아이디문제언어결과실행 시간메모리
992987tch1cherinXOR (IZhO12_xor)C++17
100 / 100
82 ms30388 KiB
#include <bits/stdc++.h> using namespace std; const int BIT_LEN = 30; struct trie { struct node { array<int, 2> go = {0, 0}; int min_x = numeric_limits<int>::max(); }; vector<node> T = {node()}; void insert(int value, int x) { int v = 0; for (int i = BIT_LEN - 1; i >= 0; i--) { int bit = (value >> i) & 1; if (!T[v].go[bit]) { T[v].go[bit] = (int)T.size(); T.push_back(node()); } v = T[v].go[bit]; T[v].min_x = min(T[v].min_x, x); } } int min_query(int xor_val, int lb) { int answer = numeric_limits<int>::max(); int v = 0; for (int i = BIT_LEN - 1; i >= 0; i--) { int bit_xor = (xor_val >> i) & 1; int bit_lb = (lb >> i) & 1; if (bit_lb == 0) { answer = min(answer, T[T[v].go[bit_lb ^ bit_xor ^ 1]].min_x); } v = T[v].go[bit_lb ^ bit_xor]; if (!v) { break; } } answer = min(answer, T[v].min_x); return answer; } }; int main() { cin.tie(nullptr)->sync_with_stdio(false); int N, x; cin >> N >> x; vector<int> a(N); for (int &value : a) { cin >> value; } vector<int> pref(N + 1); for (int i = 0; i < N; i++) { pref[i + 1] = pref[i] ^ a[i]; } trie T; T.insert(0, 0); pair<int, int> answer = {0, 0}; for (int i = 1; i <= N; i++) { int min_x = T.min_query(pref[i], x); if (min_x < i) { answer = max(answer, {i - min_x, -min_x}); } T.insert(pref[i], i); } cout << -answer.second + 1 << " " << answer.first << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...