Submission #1268254

#TimeUsernameProblemLanguageResultExecution timeMemory
1268254iamarmanXOR (IZhO12_xor)C++20
100 / 100
1749 ms34204 KiB
#include<bits/stdc++.h> using namespace std; struct Node { int child[2]; int cnt; int anyIndex; // stores an example index of a number passing through this node Node(){ child[0]=child[1]=-1; cnt=0; anyIndex=-1; } }; struct Trie { vector<Node> t; int B; Trie(int bits=31){ B = bits; t.emplace_back(); } // use 31..0 bits by default void clear(){ t.clear(); t.emplace_back(); } void insert(int val, int idx){ int cur = 0; for(int i = B; i >= 0; --i){ int b = (val >> i) & 1; if(t[cur].child[b] == -1){ t[cur].child[b] = t.size(); t.emplace_back(); } cur = t[cur].child[b]; t[cur].cnt++; t[cur].anyIndex = idx; // remember an index that goes through here } } // returns pair<maxxor, index_of_prefix_used_in_trie> pair<int,int> query_with_index(int x){ int cur = 0; if(cur == -1) return {0, -1}; int ans = 0; for(int i = B; i >= 0; --i){ if(cur == -1) break; int b = (x >> i) & 1; int want = !b; if(t[cur].child[want] != -1 && t[t[cur].child[want]].cnt > 0){ ans |= (1<<i); cur = t[cur].child[want]; } else if(t[cur].child[b] != -1 && t[t[cur].child[b]].cnt > 0){ cur = t[cur].child[b]; } else { // no path cur = -1; break; } } int idx = (cur == -1 ? -1 : t[cur].anyIndex); return {ans, idx}; } }; void solve() { int n, X; if(!(cin >> n >> X)) return; vector<int> vec(n+1,0); for(int i=1;i<=n;i++){ cin >> vec[i]; vec[i] ^= vec[i-1]; } Trie trie(29); // 0..29 bits is enough for <=1e9, change to 31 if you prefer int bestLen = 0; int bestL = -1, bestLenActual = -1; auto ok = [&](int len)->bool{ trie.clear(); trie.insert(0, 0); // prefix a[0] at index 0 for(int i = len; i <= n; ++i){ trie.insert(vec[i-len], i-len); auto pr = trie.query_with_index(vec[i]); if(pr.first >= X){ // pr.second is the prefix index j used; subarray is j+1 .. i bestL = pr.second + 1; bestLenActual = i - pr.second; return true; } } return false; }; int lo = 1, hi = n+1; while(hi - lo > 1){ int mid = lo + (hi - lo) / 2; if(ok(mid)) lo = mid; else hi = mid; } // re-run to get concrete indices for the maximal length lo if(ok(lo)){ // print start and actual length (>= lo) cout << bestL << " " << bestLenActual << "\n"; } else { // no subarray found at all cout << -1 << "\n"; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t=1; // cin>>t; for(int i=1;i<=t;i++) { //cout<<"Case "<<i<<": "; solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...