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

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

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

Overlapping Intervals

返回题目

题解

인덱스는 설명에서 000부터 시작한다고 하자.

K≥2K\ge 2K≥2인 답에서, 어느 순간 연속한 두 구간의 왼쪽 끝이 a<ba<ba<b라고 하자. 먼저 aaa에서 시작한 구간을 닫고, 그 뒤에 새로운 구간의 왼쪽 끝을 골라야 한다.

dp⁡[a][b]\operatorname{dp}[a][b]dp[a][b]를 왼쪽 끝이 a,ba,ba,b인 두 구간에서 시작하여 만들 수 있는 구간 개수의 최댓값이라고 정의한다. 불가능하면 000이다.

bbb보다 뒤에서 SaS_aSa​와 같은 문자가 처음 나타나는 위치를 ccc라고 하자. 그런 위치가 없다면 dp⁡[a][b]=0\operatorname{dp}[a][b]=0dp[a][b]이다. 에서 시작한 구간의 오른쪽 끝을 보다 더 뒤의 같은 문자로 잡는 것은 이후에 사용할 수 있는 위치를 줄이기만 하므로, 항상 가장 이른 위치 만 고려하면 충분하다.

두 구간만으로 끝내려면 ccc보다 뒤에 SbS_bSb​와 같은 문자가 존재해야 한다. 이 경우 dp⁡[a][b]≥2\operatorname{dp}[a][b]\ge 2dp[a][b]≥2이다.

세 구간 이상을 만들려면 ccc보다 뒤의 어떤 위치 ddd를 새로운 구간의 왼쪽 끝으로 고른다. 이후의 문제는 왼쪽 끝이 b,db,db,d인 상태와 같으므로 다음 점화식을 얻는다.

dp⁡[a][b]=max⁡(2, 1+max⁡d>cdp⁡[b][d])\operatorname{dp}[a][b]=\max\left(2,\ 1+\max_{d>c}\operatorname{dp}[b][d]\right)dp[a][b]=max(2, 1+d>c

여기서 첫 번째 항은 실제로 ccc보다 뒤에 SbS_bSb​가 존재할 때만 사용할 수 있고, 두 번째 항은 해당 범위에 양수인 상태가 있을 때만 사용할 수 있다.

각 bbb에 대해 다음 suffix maximum을 관리한다.

suf⁡[b][x]=max⁡d≥xdp⁡[b][d]\operatorname{suf}[b][x]=\max_{d\ge x}\operatorname{dp}[b][d]suf[b][x]=d≥xmax​dp[b][d]

그러면 점화식의 최댓값을 O(1)O(1)O(1)에 구할 수 있다. dp⁡[a][b]\operatorname{dp}[a][b]dp[a][b]는 dp⁡[b][d]\operatorname{dp}[b][d]dp[b][d]만 참조하고 항상 a<b<da<b<d이므로, 를 큰 값부터 작은 값 순서로 처리하면 된다.

마지막으로 모든 dp⁡[a][b]\operatorname{dp}[a][b]dp[a][b]의 최댓값을 구한다. 같은 문자가 두 번 이상 등장하지만 두 구간을 만들 수 없는 경우에는 답이 111이며, 같은 문자가 한 번도 반복되지 않으면 답은 000이다.

다음 등장 위치는 각 위치와 문자에 대해 전처리할 수 있다. 상태 수와 suffix maximum의 크기가 모두 O(N2)O(N^2)O(N2)이므로 시간 복잡도는 O(N2)O(N^2)O(N2), 메모리 복잡도는 O(N2)O(N^2)O(이다.

Solution written by GPT5.6

=
0
aaa
ccc
ccc
max
​
dp
[
b
]
[
d
]
)
a
<
b<
d
aaa
N
2
)