![](https://blog.kakaocdn.net/dn/d4gE46/btqV2WP6tHC/WhjSYDbzAKvZLZe8Fd6g2k/img.png)
문제 설명
펜윅트리를 하며 비트마스킹을 써왔던 것이 조금은 도움이 되었습니다.
이번 문제는 만들어둔 사진으로 대체하겠습니다.
아래의 과정(BFS)을 반복적으로 거치고 나면 가장 처음에 입력된 값을 기준으로 1의 거리를 가진 간선들이 연결되어 있습니다.
![](https://blog.kakaocdn.net/dn/boCpsy/btqWxfHh0P6/dCk4OBIDBokK0S8KVuiVX0/img.jpg)
![](https://blog.kakaocdn.net/dn/mMMNM/btqV8GGps5k/UkRsClxNNTbig9MGv1HhTk/img.jpg)
![](https://blog.kakaocdn.net/dn/8yfvD/btqWc9n1y5w/XuDZ40oHfNCpp4pG51gK00/img.jpg)
![](https://blog.kakaocdn.net/dn/nPUUf/btqWjpRw3iM/xcexK1rTZXHCHeU3aXQUck/img.jpg)
![](https://blog.kakaocdn.net/dn/ILefU/btqWxftI9js/FhCW8L2Dxzar0VlL9WaJKk/img.jpg)
![](https://blog.kakaocdn.net/dn/IIbTh/btqWBARoziz/vU3fBIw7E6ATGIuKhvA0nK/img.jpg)
![](https://blog.kakaocdn.net/dn/erZ5q7/btqWjpYniZF/y4HhMV6BMdlKu7b4KvuP71/img.jpg)
![](https://blog.kakaocdn.net/dn/c9vq0E/btqWjqCZ0qM/7v1XvZWBJoGJKLk6K4Nvx0/img.jpg)
![](https://blog.kakaocdn.net/dn/bqOvKR/btqWx6ce48N/AUrFpXj7n7cnZMxGgrBln1/img.jpg)
![](https://blog.kakaocdn.net/dn/bhn0TV/btqWBzZfm81/FKK9iVFaMuBts1PivU2Uo1/img.jpg)
![](https://blog.kakaocdn.net/dn/cdRqEE/btqWBADRyF0/IPrm9eF3uftEcBcdasHzt1/img.jpg)
![](https://blog.kakaocdn.net/dn/QpMG6/btqWn2uW4uA/ZBNDEBze9SOva8urqYKyw1/img.jpg)
![](https://blog.kakaocdn.net/dn/QRG4a/btqWztkHJhI/itVDWfIBcJHtB5ypIYwdR1/img.jpg)
![](https://blog.kakaocdn.net/dn/bezkJM/btqWx6pMmey/ZLmWCgDALwWkGHauAuT6A1/img.jpg)
![](https://blog.kakaocdn.net/dn/kRM7i/btqWxfHh0Si/KjEbku1potEjk2f4nl4C4k/img.jpg)
![](https://blog.kakaocdn.net/dn/cxtMWd/btqWn2Pff0h/QMVZDcju7EI7vCmkqQmDg0/img.jpg)
![](https://blog.kakaocdn.net/dn/cUXTTJ/btqWsJaMyXB/ot8NYCTmkqiO3Npw6P8Em1/img.jpg)
![](https://blog.kakaocdn.net/dn/zpdN4/btqWn1pi9rf/keoJky03kM2oHClwJ150I0/img.jpg)
![](https://blog.kakaocdn.net/dn/cALNQ8/btqWBAYaFu4/EPtXq3Kds6wE4gvHg2UFu0/img.jpg)
![](https://blog.kakaocdn.net/dn/3PYjy/btqWjqCZ0t1/5ktaQByNGbJ2Xe4no7g8v0/img.jpg)
![](https://blog.kakaocdn.net/dn/Ql8qF/btqWn1ixtVF/ziI256sdFy3C5lQ2hPvhe0/img.jpg)
![](https://blog.kakaocdn.net/dn/Fwl9w/btqWBADRyNo/w0rkzpnEeozEzGIjuZnzLK/img.jpg)
![](https://blog.kakaocdn.net/dn/4lbZE/btqV36ZGqR6/W3drE9JEz3S5uZlitXh09k/img.jpg)
![](https://blog.kakaocdn.net/dn/v2yBO/btqV37qK1Sw/u64gENZsd7ZDmkd4jahrbk/img.jpg)
![](https://blog.kakaocdn.net/dn/lfEUs/btqWxfHh0Uc/PeV5fz8mzo6TDo6N3XqlCk/img.jpg)
![](https://blog.kakaocdn.net/dn/Fq7Qo/btqWzszirEP/Vw0DOL7QzbH1IeMVibHfN0/img.jpg)
![](https://blog.kakaocdn.net/dn/c7iBut/btqWn2V1pQ7/Hkz80BHTysubL5BzYnzinK/img.jpg)
![](https://blog.kakaocdn.net/dn/4efgB/btqWx6wyOWn/MwRskmU1SAVYI2jtVM9Yk1/img.jpg)
소스 코드
Python
from collections import deque
import sys
input = sys.stdin.readline
MIN = -10e9
N = int(input())
M = int(input())
arr = [MIN]*1000001
dq = deque()
xs = list(map(int,input().split()))
for x in xs:
arr[x] = 0
dq.append(x)
maxnum = 0
while dq:
x = dq.popleft()
for i in range(20):
nx = x^ (1<<i)
if nx>N or arr[nx]!= -10e9:
continue
dq.append(nx)
arr[nx]=arr[x]+1
maxnum = max(arr[nx],maxnum)
print(maxnum)
Java8
import java.util.*;
import java.io.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int answer;
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(br.readLine());//기본 입력
int M = Integer.parseInt(br.readLine());
Deque<Integer> dq = new ArrayDeque<Integer>();
int arr[] = new int[1000001];//최대초기화
Arrays.fill(arr, Integer.MIN_VALUE);
st = new StringTokenizer(br.readLine());
for(int i=1;i<=M;i++) {
int x =Integer.parseInt(st.nextToken());
arr[x] = 0;
dq.offerLast(x);
}//M의 범위 1<=M
while(!dq.isEmpty()) {
int x = dq.pollFirst();
for(int i =0;i<20;i++){
int nx = x^(1<<i);
if(nx>N||arr[nx]!=Integer.MIN_VALUE)continue;
arr[nx] = arr[x]+1;
dq.offerLast(nx);
answer = Math.max(answer, arr[nx]);
}
}
System.out.println(answer);
}
}