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

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

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

bbbbbbbbinary sequence

문제로 돌아가기

해설

각 문자열을 낮은 차수의 계수부터 적은 F2\mathbb{F}_2F2​ 위의 다항식으로 생각하자. 문자열의 첫 문자가 111이므로 모든 다항식의 상수항은 111이다. 시프트 aaa는 다항식에 xax^axa를 곱하는 것과 같다.

현재 몇 개의 정규화된 다항식이 각각 어떤 위치에서 시작하도록 배치되어 전체 XOR가 000이 된다고 가정하자. 가장 작은 시작 위치를 갖는 항은 반드시 두 개 이상이다. 하나뿐이라면 그 위치의 비트를 지울 다른 항이 없기 때문이다.

따라서 시작 위치가 같은 두 항을 하나 골랐다고 가정하고 백트래킹할 수 있다. 두 정규화된 다항식 P,QP,QP,Q의 시작 위치를 맞춘 뒤 XOR한다.

  • P⊕Q=0P\oplus Q=0P⊕Q=0이면 두 항은 서로 완전히 상쇄된다. 두 항을 제거한다.
  • P⊕Q≠0P\oplus Q\ne 0P⊕Q=0이면 앞쪽의 연속된 00의 개수를 라 하자. 에서 앞의 개 비트를 제거하여 다시 첫 비트가 인 다항식으로 정규화하고, 두 항을 이 새 항 하나로 바꾼다. 새 항의 시작 위치는 기존 시작 위치보다 만큼 뒤이다.

가능한 모든 두 항을 골라 재귀한다. 실제 해가 있다면 그 해에서 시작 위치가 최소인 두 항 중 하나를 고르는 분기가 반드시 존재한다. 위 변환 뒤에도 남은 항들의 XOR는 000이므로, 이 과정을 반복하면 완전한 해를 찾을 수 있다. 반대로 재귀가 모든 항을 상쇄했다면, 각 병합에서 기록한 상대 위치를 이용해 원래 문자열들의 시프트를 복원할 수 있다.

복원을 위해 각 현재 항에 그 항을 이루는 원래 문자열 번호와 상대 시프트를 저장한다. 두 항을 합친 결과에서 앞의 ddd비트를 제거했다면, 합쳐진 모든 원래 문자열의 상대 시프트에서 ddd를 뺀다. 두 항이 완전히 상쇄되면 그 항에 포함된 상대 시프트의 최솟값을 빼서 최솟값이 000이 되도록 만든다. 서로 완전히 상쇄된 묶음은 독립적으로 이동해도 XOR가 계속 000이므로, 각 묶음을 따로 정규화해도 된다.

현재 다항식의 길이는 항상 LLL 이하이다. 하나의 원래 문자열은 완전히 상쇄되기 전까지 최대 N−2N-2N−2번 정규화될 수 있고, 한 번에 제거되는 비트 수는 최대 L−1L-1L−1이다. 따라서 복원된 시프트는 항상 000 이상 (N−2)(L−1)(N-2)(L-1) 이하로 만들 수 있다.

각 다항식을 64비트 정수 배열로 저장하면 두 항의 XOR와 정규화를 O(⌈L/64⌉)O(\lceil L/64\rceil)O(⌈L/64⌉)에 처리할 수 있다. 재귀 트리의 크기는 NNN에만 의존하며 N≤8N\le 8N≤8이므로 충분히 작다. 같은 재귀 단계에서 다항식 값이 같은 두 쌍은 하나만 시도하여 중복 분기를 줄일 수 있다.

Solution written by GPT5.6

0
ddd
P⊕QP\oplus QP⊕Q
ddd
111
ddd
(N−
2)(L−
1)