제출 #41689

#제출 시각아이디문제언어결과실행 시간메모리
41689MatheusLealVXOR (IZhO12_xor)C++14
100 / 100
292 ms65788 KiB
#include <bits/stdc++.h> #define N 250005 #define logn 31 using namespace std; int n, k, v[N], dp[N], ans; struct node { node *prox[2]; int best; node() {prox[0] = prox[1] = NULL, best = 0;} }; node *root; inline void add(int num, int id, node *root) { root->best = id; for(int i = logn; i >= 0; i--) { int bit = (num & (1<<i)) ? 1:0; if(!root->prox[bit]) root->prox[bit] = new node(); root = root->prox[bit]; root->best = id; } } inline int query(node *root, int x) { for(int i = logn; i >= 0; i--) { int bit = (x & (1<<i)) ? 1:0; int aux = (k & (1<<i)) ? 1:0; if(aux) { if(!root->prox[!bit]) return -1; root = root->prox[!bit]; } else { if(root->prox[!bit]) return root->prox[!bit]->best; root = root->prox[bit]; } } return root->best; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>k; root = new node(); for(int i = 1; i <= n; i++) { cin>>v[i]; v[i] ^= v[i - 1]; add(v[i], i, root); } for(int i = 1; i <= n; i++) { dp[i] = query(root, v[i - 1]); ans = max(ans, dp[i] - i + 1); } for(int i = 1; i <= n; i++) if(dp[i] - i + 1 == ans) { cout<<i<<" "<<ans<<"\n"; return 0; } }
#Verdict Execution timeMemoryGrader output
Fetching results...