제출 #1179099

#제출 시각아이디문제언어결과실행 시간메모리
1179099qrnXOR (IZhO12_xor)C++20
100 / 100
155 ms60556 KiB
#include <bits/stdc++.h> using namespace std; #define SPEED ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); #define pb push_back #define fi first #define se second #define endl "\n" #define ALL(x) x.begin(), x.end() #define sz(x) x.size() #define intt long long const intt mod = 1e9 + 7; const intt inf = 1e18; const intt mxN = 2e5 + 5; struct trie { trie *kids[2]; intt idx; // bu Node-a catan ilk pref indexi trie () { kids[0] = 0; kids[1] = 0; idx = inf; } }; void add(trie *& root, intt X, intt idxi) { trie *node = root; for(intt i = 30; i >= 0; i--) { intt bit = ((1 << i) & X) > 0; if(node->kids[bit] == 0){ node->kids[bit] = new trie(); } node = node->kids[bit]; node->idx = min(node->idx, idxi); } } intt get(trie *& root, intt x, intt k) { trie *curr = root; intt ret = 2 * inf; for (intt bit = 30; bit >= 0; bit--) { intt numbit = (x >> bit) & 1; intt Xbit = (k >> bit) & 1; if (numbit == 1) { if (Xbit == 1) { if (curr->kids[0]) { if (bit == 0) ret = min(ret, curr->kids[0]->idx); curr = curr->kids[0]; } else { return ret; } } else { if (curr->kids[0]) ret = min(ret, curr->kids[0]->idx); if (curr->kids[1]) { if (bit == 0) ret = min(ret, curr->kids[1]->idx); curr = curr->kids[1]; } else { return ret; } } } else { if (Xbit == 1) { if (curr->kids[1]) { if (bit == 0) ret = min(ret, curr->kids[1]->idx); curr = curr->kids[1]; } else { return ret; } } else { if (curr->kids[1]) ret = min(ret, curr->kids[1]->idx); if (curr->kids[0]) { if (bit == 0) ret = min(ret, curr->kids[0]->idx); curr = curr->kids[0]; } else { return ret; } } } } return ret; } void solve() { intt N, X; cin >> N >> X; vector<intt> A(N+1), pref(N+1); for(intt i = 1; i <= N; i++) cin >> A[i]; A[0] = pref[0] = 0; for(intt i = 1; i <= N; i++) { pref[i] = A[i]; if(i) pref[i] ^= pref[i-1]; } trie *root = new trie(); intt l = 0, k = 0, diff = 0; for(intt i = 0; i <= N; i++) { intt for_l = get(root, pref[i], X) + 1; if(for_l < inf + 10 && diff < i - for_l + 1) { diff = i - for_l + 1; l = for_l; } else if(diff == i - for_l + 1 && for_l < l) { l = for_l; } add(root, pref[i], i); } cout << l << " " << diff << endl; } signed main() { SPEED; intt tst = 1; // cin >> tst; while (tst--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...