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

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

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

멋진 이름 짓기

返回题目

题解

Claim. sis_isi​ 중 최대 점수를 받는 이름이 존재한다.

Proof. 어떤 이름 ttt가 최대 점수 vvv를 받는다고 가정하자. 다음 과정을 반복한다.

  • ttt가 sis_isi​ 중 어느 것과도 다르다면 마지막 글자를 제거한다.
  • ttt와 같은 sis_isi​가 존재한다면, 이 과정을 종료한다.

ttt가 sis_isi​ 중 어느 것과도 다르다면, i∈{1,2,…,n}i \in \{1, 2, \dots, n\}i∈{1,2,…,n} 중 가 의 접두사인 의 집합은 의 마지막 글자를 지워도 변하지 않는다. 따라서, 마지막 글자를 지워도 점수가 변하지 않는다. 의 길이가 유한하므로, 위 과정을 반복하다 보면 언젠가는 최대 점수를 가지며 중 적어도 하나와 같은 문자열에 도달하게 된다.

위 증명에 의해, nnn개의 문자열 sis_isi​가 가지는 점수를 모두 계산하고, 그 중 최댓값을 출력하면 된다. 이는 O(n∑∣si∣)O(n \sum |s_i|)O(n∑∣si 시간에 쉽게 구현할 수 있다. Trie 등의 자료구조를 사용해 시간으로 최적화하는 것도 가능하지만, 문제를 풀기 위해 요구되는 최적화는 아니다.

sis_isi​
ttt
iii
ttt
ttt
sis_isi​
​
∣
)
O(∑∣si∣)O(\sum |s_i|)O(∑∣si​∣)