DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제문제집
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

XOR 병합

문제로 돌아가기

해설

P0=0P_0=0P0​=0, Pi=A1⊕A2⊕⋯⊕AiP_i=A_1\oplus A_2\oplus\cdots\oplus A_iPi​=A1​⊕A2​⊕⋯⊕Ai​라 하자. 전체 XOR을 S=PNS=P_NS=PN​이라 하자.

병합 연산은 내부 원소 PiP_iPi​ 하나를 삭제하는 것과 같다.

최종 수열의 모든 값이 kkk이고 길이가 mmm이라면 prefix XOR은

0,k,0,k,⋯0,k,0,k,\cdots0,k,0,k,⋯

꼴이다. 또한 전체 XOR SSS는 연산으로 변하지 않는다.

S≠0S\ne 0S=0인 경우

mmm은 홀수이고 반드시 k=Sk=Sk=S이다. 따라서 목표 prefix XOR은 0,S,0,S,⋯ ,S0,S,0,S,\cdots,S0,S,0,S,⋯,S이다.

원래 PPP에서 값이 000 또는 SSS인 원소만 남겨 보자. 이 수열을 같은 값이 연속한 구간들로 나눈 개수를 CCC라 하자. 각 구간에서 하나씩만 남기면 0,S,0,S,⋯ ,S0,S,0,S,\cdots,S0,S,0,S가 된다. 그 외의 prefix 원소는 모두 삭제해야 하므로 정답은

N+1−CN+1-CN+1−C

이다.

S=0S=0S=0인 경우

내부 prefix XOR P1,⋯ ,PN−1P_1,\cdots,P_{N-1}P1​,⋯,PN−1​ 중 000이 아닌 원소의 개수를 이라 하자. 에서 연속한 두 사이의 구간 수를 라 하자.

k=0k=0k=0을 선택하면 000이 아닌 내부 prefix XOR을 모두 삭제하면 되므로 비용은 MMM이다.

이제 k≠0k\ne 0k=0을 고정하자. 모든 000 prefix를 남겨도 최적해가 나빠지지 않는다. 각 두 000 사이에는 목표 수열에서 kkk가 정확히 하나 필요하다. 값 kkk가 이미 등장하는 구간 수를 라 하자. 그런 구간에서는 하나를 남겨 삭제 한 번을 아낄 수 있고, 등장하지 않는 구간에서는 하나를 삽입해야 한다. 따라서 비용은

M−Hk+(G−Hk)=M+G−2HkM-H_k+(G-H_k)=M+G-2H_kM−Hk​+(G−Hk​

이다.

H=max⁡HkH=\max H_kH=maxHk​라 하면 최종 정답은

min⁡(M, M+G−2H)\min(M,\ M+G-2H)min(M, M+G−2H)

이다.

HHH는 왼쪽부터 prefix XOR을 훑으며 계산할 수 있다. 000을 만날 때마다 구간 번호를 증가시킨다. 000이 아닌 값 vvv에 대해서는 마지막으로 센 구간 번호와 등장 구간 수를 해시 테이블에 저장하면, 같은 구간에서 vvv가 여러 번 나와도 한 번만 셀 수 있다.

시간 복잡도는 기대값 기준 O(N)O(N)O(N), 메모리 복잡도는 O(N)O(N)O(N)이다.

Solution written by GPT5.6

TMI. 참고로 원래는 분할 연산이 있었습니다.

  • 분할: 1≤i<∣A∣,x⊕y=Ai1\le i<\lvert A\rvert, x\oplus y=A_i1≤i<∣A∣,x⊕y=Ai​를 만족하는 정수 i,x,를 골라 의 번째 원소를 삭제하고 그 위치에 를 삽입한다.

이는 위의 prefix XOR 접근으로 보았을 때 내부 원소를 추가하는 것과 같고, 이는 삭제보다 효율적이지 않아 답에는 영향을 주지 않습니다.

,
⋯
,
S
MM
M
PPP
000
GGG
HkH_kHk​
kkk
kkk
)
=
M+
G−
2Hk​
yi,x,y
i,x,y
AAA
iii
x,yx,yx,y