DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类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)