Submission #1028732

#TimeUsernameProblemLanguageResultExecution timeMemory
1028732VectorLiXOR (IZhO12_xor)C++14
100 / 100
70 ms46752 KiB
#include <bits/stdc++.h> #define long long long using namespace std; const int N = 250000; struct trie { int n; int e[N * 30 + 1][2]; int m[N * 30 + 1]; trie() { for (int i = 0; i < N * 30 + 1; i++) { m[i] = numeric_limits<int>::max(); } } void insert(int x, int p) { int u = 0; for (int i = 29; i >= 0; i--) { m[u] = min(m[u], p); int &v = e[u][(x >> i) & 1]; if (v == 0) { v = ++n; } u = v; } m[u] = min(m[u], p); } int query(int x, int k) { int u = 0; int h = numeric_limits<int>::max(); for (int i = 29; i >= 0; i--) { int b = (x >> i) & 1; if ((k >> i) & 1) { if (e[u][b ^ 1] == 0) { break; } else { k = k - (1 << i); u = e[u][b ^ 1]; } } else { if (e[u][b ^ 1] > 0) { h = min(h, m[e[u][b ^ 1]]); } if (e[u][b] == 0) { break; } else { u = e[u][b]; } } } return h; } } t; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; k = k - 1; vector<int> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } vector<int> s(n + 1); for (int i = 0; i < n; i++) { s[i + 1] = s[i] ^ a[i]; } t.insert(0, 0); int l = 0, st = 0; for (int i = 1; i < n + 1; i++) { int p = t.query(s[i], k); if (p == numeric_limits<int>::max()) { t.insert(s[i], i); continue; } if (i - p > l) { l = i - p; st = p; } t.insert(s[i], i); } cout << st + 1 << " " << l << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...