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

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

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

겹치는 구간

문제로 돌아가기

해설

인덱스는 설명에서 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
)