제출 #1092412

#제출 시각아이디문제언어결과실행 시간메모리
1092412juicyXOR (IZhO12_xor)C++17
100 / 100
1568 ms24664 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 25e4 + 5, M = 7500005, LG = 30; int n, k, node = 1; int a[N], nxt[M][2], lst[M]; void reset() { while (node) { nxt[node][0] = nxt[node][1] = lst[node] = 0; --node; } node = 1; } void add(int x, int i) { int p = 1; for (int j = LG - 1; ~j; --j) { int c = x >> j & 1; if (!nxt[p][c]) { nxt[p][c] = ++node; } p = nxt[p][c]; } if (!lst[p]) { lst[p] = i; } } array<int, 2> qry(int x) { int m = 0, p = 1; for (int j = LG - 1; ~j; --j) { int c = x >> j & 1; if (nxt[p][c ^ 1]) { m += 1 << j; p = nxt[p][c ^ 1]; } else { assert(nxt[p][c]); p = nxt[p][c]; } } assert(lst[p]); return {m, lst[p]}; } int check(int m) { reset(); for (int i = 1, j = 0; i <= n; ++i) { while (j <= i - m) { add(a[j], j + 1); ++j; } if (i >= m) { auto [x, l] = qry(a[i]); if (x >= k) { return l; } } } return 0; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> a[i]; a[i] ^= a[i - 1]; } int l = 1, r = n, p = -1, len = -1; while (l <= r) { int m = (l + r) / 2; int i = check(m); if (i) { p = i; len = m; l = m + 1; } else { r = m - 1; } } cout << p << " " << len << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...