해설
어떤 선택의 OR 결과를 라고 하자. 우리가 원하는 것은 인 가능한 중 최댓값이다.
정수의 크기 비교를 이진수로 생각해 보자. 이 되려면 다음 중 하나이다.
- .
- 가장 높은 차이 나는 비트 에서 은 , 는 이고, 그보다 높은 비트들은 모두 같다.
두 번째 경우, 보다 낮은 비트들은 무엇이든 가능하다. 따라서 인 모든 값 는 다음 형태의 값 중 하나의 bitwise submask이다.
- .
- 의 어떤 켜진 비트 를 으로 바꾸고, 그보다 낮은 비트들을 모두 로 바꾼 값.
이러한 후보 mask를 라고 하자. 어떤 선택의 OR 결과가 의 submask가 되려면, 선택한 모든 역시 의 submask여야 한다. 즉 다음 조건을 만족해야 한다.
어떤 에 대해 이 조건을 만족하는 들만 골라 OR하면, 결과는 여전히 의 submask이므로 이하이고, 따라서 이하이다. 또한 OR 연산은 원소를 더 선택해도 값이 감소하지 않으므로, 고를 수 있는 들을 모두 고르는 것이 해당 안에서 최적이다.
따라서 모든 후보 mask 에 대해 다음 값을 계산한다.
조건을 만족하는 가 하나 이상 있는 후보들 중 이 값의 최댓값이 정답이다. 어떤 후보에서도 하나 이상 고를 수 없다면 을 출력한다.
후보 mask의 수는 최대 개이고, 각 후보마다 개의 수를 확인하므로 시간 복잡도는 이다. 추가 메모리 사용량은 입력 배열을 제외하면 이다.