DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Making a Monochrome String

返回题目

题解

0\texttt{0}0의 개수와 1\texttt{1}1의 개수를 각각 C0,C1C_0, C_1C0​,C1​이라고 하자.

만약 C0=0C_0=0C0​=0 또는 C1=0C_1=0C1​=0이면 문자열은 처음부터 단색이므로 답은 00이다.

만약 C0=C1C_0=C_1C0​=C1​이면 문자열 전체를 한 번에 삭제할 수 있으므로 답은 111이다.

이제 C0≠C1C_0 \ne C_1C0​=C1​이고 두 문자가 모두 존재한다고 하자. 더 많이 등장하는 문자를 majority 문자라고 부르자. majority 문자를 +1+1+1, 나머지 문자를 로 바꾼 배열을 라고 하자. 전체 합을 라고 하면 이다.

삭제할 수 있는 부분 문자열은 정확히 합이 000인 구간이다. 따라서 어떤 연산을 여러 번 하더라도 전체 합 DDD는 변하지 않는다. 마지막 문자열은 단색이어야 하므로, 마지막에는 majority 문자만 정확히 DDD개 남아야 한다.

즉, 문제는 다음과 같이 바뀐다.

majority 문자 중 일부를 남기고, 나머지 문자들을 합이 000인 연속 구간들로 나누어 삭제한다. 이때 삭제하는 구간의 개수를 최소화한다.

prefix sum을 다음과 같이 정의하자.

P0=0,Pi=A1+A2+⋯+AiP_0 = 0,\qquad P_i = A_1 + A_2 + \cdots + A_iP0​=0,Pi​=A
0
−1-1−1
AAA
DDD
D>0D>0D>0
1​
+
A2​+
⋯+
Ai​

구간 (l+1,…,r)(l+1,\ldots,r)(l+1,…,r)의 합이 000이라는 것은 Pl=PrP_l=P_rPl​=Pr​이라는 뜻이다.

dpidp_idpi​를 앞의 iii글자까지 처리했고, iii번째 위치가 현재 경계일 때 필요한 최소 연산 횟수라고 하자. 위치 j+1j+1j+1의 문자가 majority 문자라면 이 문자를 남길 수 있다. 이때 이전 경계 iii에서 jjj까지의 구간을 삭제하려면 Pi=PjP_i=P_jPi​=Pj​여야 한다.

같은 prefix sum을 가진 이전 경계들의 dpdpdp 최솟값을 bestbestbest에 저장하면 각 위치마다 O(1)O(1)O(1)에 전이할 수 있다.

전이는 다음 두 경우이다.

  • 바로 현재 majority 문자를 남긴다. 비용은 증가하지 않는다.
  • 같은 prefix sum을 가진 이전 경계에서 현재 위치 직전까지의 비어 있지 않은 구간을 삭제한 뒤 현재 majority 문자를 남긴다. 비용이 111 증가한다.

모든 위치를 처리한 뒤, 마지막 suffix도 합이 000이면 한 번 더 삭제할 수 있다.

전체 시간 복잡도는 O(N)O(N)O(N), 메모리 복잡도는 O(N)O(N)O(N)이다.