DOJ logoDOJ
問題
最近追加された問題保存した問題
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

Writing with a Stamp

問題に戻る

解説

도장을 찍는 것은 무료이므로, 도장 문자열을 정했다면 등장하는 모든 위치에 찍는다. 길이 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] 범위로 조정한 길이가 최적이다.