제출 #638860

#제출 시각아이디문제언어결과실행 시간메모리
638860MohamedAhmed04XOR (IZhO12_xor)C++14
100 / 100
114 ms25292 KiB
#include <bits/stdc++.h> using namespace std ; const int MAX = 3e5 + 10 ; int arr[MAX] ; int n , x ; int trie[MAX*30][2] , val[MAX*30] ; int pref[MAX] ; int id = 0 ; void Insert(int idx) { int node = 0 , y = pref[idx] ; for(int bit = 29 ; bit >= 0 ; --bit) { bool t = (y & (1 << bit)) ; if(!trie[node][t]) trie[node][t] = ++id ; node = trie[node][t] ; if(!val[node]) val[node] = idx ; } return ; } int query(int y) { int node = 0 , ans = 1e9 ; for(int bit = 29 ; bit >= 0 ; --bit) { bool t = (y & (1 << bit)) , t2 = (x & (1 << bit)) ; if(t2) { if((!trie[node][!t])) return ans ; node = trie[node][!t] ; } else { if(trie[node][!t]) ans = min(ans , val[trie[node][!t]]) ; if((!trie[node][t])) return ans ; node = trie[node][t] ; } } ans = min(ans , val[node]) ; return ans ; } int main() { ios_base::sync_with_stdio(0) ; cin.tie(0) ; cin>>n>>x ; for(int i = 1 ; i <= n ; ++i) cin>>arr[i] ; Insert(0) ; for(int i = 1 ; i <= n ; ++i) pref[i] = pref[i-1] ^ arr[i] ; int idx = -1 , Max = -1 ; for(int i = 1 ; i <= n ; ++i) { int j = query(pref[i]) ; if(i-j > Max) idx = j+1 , Max = i-j ; Insert(i) ; } return cout<<idx<<" "<<Max<<"\n" , 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...