제출 #869117

#제출 시각아이디문제언어결과실행 시간메모리
869117tvladm2009XOR (IZhO12_xor)C++17
100 / 100
77 ms46768 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 250000 + 7; int trie[30 * N][2], c[30 * N], a[N]; int n, y, id = 0; void add(int x, int p) { int node = 0; for (int b = 29; b >= 0; b--) { int k = ((x & (1 << b)) > 0); if (trie[node][k] == 0) { trie[node][k] = ++id; } node = trie[node][k]; c[node] = min(c[node], p); } } int srch(int x) { int res = n + 1, node = 0; for (int b = 29; b >= 0; b--) { int k = ((x & (1 << b)) > 0); if (y & (1 << b)) { if (k > 0) { if (trie[node][0] == 0) { break; } node = trie[node][0]; } else { if (trie[node][1] == 0) { break; } node = trie[node][1]; } } else { if (k > 0) { if (trie[node][0] > 0) { res = min(res, c[trie[node][0]]); } node = trie[node][1]; } else { if (trie[node][1] > 0) { res = min(res, c[trie[node][1]]); } node = trie[node][0]; } } } return res; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("input", "r", stdin); cin >> n >> y; y--; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i < 30 * N; i++) { c[i] = n + 1; } add(0, 0); int ind = 0, k = 0, xr = 0; for (int i = 1; i <= n; i++) { xr ^= a[i]; add(xr, i); int rez = srch(xr); if (i - rez > k) { k = i - rez; ind = rez; } else if (rez == k) { ind = min(ind, rez); } } cout << ind + 1 << " " << k << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...