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

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

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

글 쓰기

문제로 돌아가기

해설

도장을 찍는 것은 무료이므로, 도장 문자열을 정했다면 등장하는 모든 위치에 찍는다. 길이 xxx인 도장의 등장 끝 위치를 p1<⋯<pkp_1<\cdots<p_kp1​<⋯<pk​, 인접 간격을 di=pi+1−pid_i=p_{i+1}-p_idi​=pi+1​−pi​라 하자. 덮이는 위치 수와 필요한 힘은 각각

C(x)=x+∑i=1k−1min⁡(di,x),F(x)=Bx+A(N−C(x))C(x)=x+\sum_{i=1}^{k-1}\min(d_i,x),\qquad F(x)=Bx+A(N-C(x))C(x)=x+i=1∑

이다. 도장을 만들지 않는 비용 ANANAN도 비교한다.

접미사 자동자(SAM)의 각 상태 vvv는 등장 끝 위치 집합이 같은 부분 문자열들을 나타낸다. 그 길이 범위는

L=len⁡(link⁡(v))+1,R=len⁡(v)L=\operatorname{len}(\operatorname{link}(v))+1,\qquad R=\operatorname{len}(v)L=len(link(v))+1,R=len(v)

이다. 상태마다 이 범위에서 최적 길이 하나를 구한다.

B≤AB\leq AB≤A이면 x=Rx=Rx=R을 고른다. 그렇지 않으면 r=⌊(B−1)/A⌋r=\lfloor(B-1)/A\rfloorr=⌊(B−1)/A로 둔다. 이면 을 고르고, 나머지는 번째로 큰 간격 를 구해

x=min⁡(R,max⁡(L,d))x=\min(R,\max(L,d))x=min(R,max(L,d))

로 정한다. 선택한 xxx보다 작은 간격의 개수와 합을 c,zc,zc,z라 하면 C(x)=x+z+(k−1−c)xC(x)=x+z+(k-1-c)xC(x)=x+z+(k로 계산한다.

끝 위치 집합은 suffix link 트리의 아래쪽에서 위쪽으로 합친다. 작은 집합의 위치들을 큰 집합에 삽입하면 각 위치는 O(log⁡N)O(\log N)O(logN)번만 이동한다. 위치들을 정렬된 집합으로 관리하면 삽입 시 이웃 사이의 간격 하나를 지우고 새 간격을 최대 두 개 추가하면 된다. 간격의 개수와 합을 저장하는 세그먼트 트리로 갱신, 부분합, 순위 질의를 각각 O(log⁡N)O(\log N)O(logN)에 처리한다.

모든 상태의 최소 비용과 ANANAN 중 최솟값이 정답이다. 시간 복잡도는 O(Nlog⁡2N)O(N\log^2 N)O(Nlog2N), 공간 복잡도는 O(Nlog⁡N)O(N\log N)O(NlogN이다.

증명

같은 도장은 모든 등장 위치에 찍어도 서로 모순되지 않는다. 첫 도장은 xxx개 위치를 덮고, 이후 도장은 직전 끝 위치와의 간격에 따라 min⁡(di,x)\min(d_i,x)min(di​,x)개씩 새로 덮으므로 C(x)C(x)C(x)의 식을 얻는다. 모든 부분 문자열은 SAM의 어느 상태와 길이에 대응하므로, 각 상태에서 최적 길이를 구하면 모든 유용한 도장을 고려한다.

끝 위치 집합이 고정되어 있을 때

k−1
​
min
(
di​
,
x
)
,
F
(
x
)
=
Bx+
A(N−
C(x))
⌋
r>k−1r>k-1r>k−1
x=Lx=Lx=L
rrr
ddd
−
1−
c)x
)
F(x)−F(x−1)=B−A(1+#{i:di≥x})F(x)-F(x-1)=B-A\bigl(1+\#\{i:d_i\geq x\}\bigr)F(x)−F(x−1)=B−A(1+#{i:di​≥x})

는 xxx에 대해 감소하지 않으므로 FFF는 볼록하다. B≤AB\leq AB≤A이면 항상 차분이 000 이하이므로 RRR이 최적이다. B>AB>AB>A이고 r>k−1r>k-1r>k−1이면 항상 차분이 양수이므로 LLL이 최적이다. 나머지 경우에는 rrr번째로 큰 간격 ddd까지 차분이 000 이하이고 그 이후에는 양수이다. 따라서 ddd를 [L,R][L,R][L,R] 범위로 조정한 길이가 최적이다.