배열 A(초기에 0 포함)에 대해 삽입·삭제·최대 XOR 질의를 처리합니다. 비트 기반 이진 트라이에 카운트를 유지해 중복과 삭제를 안전히 지원하고, 쿼리 시 각 비트에서 상반된 가지를 우선 선택해 최댓값을 구성합니다. 각 연산은 O(30)로 1초, 512MB 제한에 안전합니다.
// 더 많은 정보는 42jerrykim.github.io 에서 확인하세요.
#include<bits/stdc++.h>usingnamespacestd;structTrieNode{intchild[2];intcnt;TrieNode():child{-1,-1},cnt(0){}};intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intM;if(!(cin>>M))return0;constintMAX_BIT=29;// since x ≤ 1e9 < 2^30
vector<TrieNode>trie;trie.reserve(31*(M+2));trie.emplace_back();// root
autoinsert_number=[&](intx){intcur=0;trie[cur].cnt++;for(intb=MAX_BIT;b>=0;--b){intbit=(x>>b)&1;if(trie[cur].child[bit]==-1){trie[cur].child[bit]=(int)trie.size();trie.emplace_back();}cur=trie[cur].child[bit];trie[cur].cnt++;}};autoerase_number=[&](intx){intcur=0;trie[cur].cnt--;for(intb=MAX_BIT;b>=0;--b){intbit=(x>>b)&1;cur=trie[cur].child[bit];trie[cur].cnt--;}};autoquery_max_xor=[&](intx)->int{intcur=0,ans=0;for(intb=MAX_BIT;b>=0;--b){intbit=(x>>b)&1;intwant=bit^1;intnxt=trie[cur].child[want];if(nxt!=-1&&trie[nxt].cnt>0){ans|=(1<<b);cur=nxt;}else{cur=trie[cur].child[bit];}}returnans;};// Initial array contains 0
insert_number(0);for(inti=0;i<M;++i){intt,x;cin>>t>>x;if(t==1)insert_number(x);elseif(t==2)erase_number(x);elsecout<<query_max_xor(x)<<'\n';}return0;}
코너 케이스 체크리스트
초기 A={0} 상태에서 곧바로 3 x 질의가 나오는 경우
같은 값을 여러 번 삽입/삭제하는 중복 처리와 cnt 정확성
x=0, x가 매우 큰 값(1e9 근처)에서의 비트 경계(29비트) 처리
모든 원소가 동일하거나, 반대로 상위 비트가 다양한 값이 섞인 경우
연속된 대량 삭제 후에도 트리 경로 접근이 유효한지(cnt>0 확인으로 보장)
제출 전 점검
비트 범위는 29..0이 맞는지(x ≤ 1e9)
루트 포함 모든 경로에서 cnt 증감 일관성 확인(언더플로 금지)
빠른 입출력 설정과 개행 출력 규격 준수
참고자료
비트 트라이를 이용한 최대 XOR 질의 표준 기법(Competitive Programming 관례)