h3mky0's blog

主に競プロについて書きます

Codeforces Round #494 (Div. 3) F. Abbreviation

問題リンク
https://codeforces.com/contest/1003/problem/F

問題概要
n個の単語が与えられる。単語同士の間に空白をおいて連結した文字列sについて、2つ以上の単語を連結したものを略語で表すとき最小の長さはいくつになるか。
例えば、to be or not to be なら, to be を略語に置き換えて(to be を TB), TB or not TBとなり, 18字から12字になる。

考えたこと
(ある文字の長さ)* (文字の頻度)が最も大きいものを略字で表せばよい。
文字の出現回数及び出現するindexはKMP法を使えばO(|S|)求めることができるので, i < jを満たす(i, j)についてチェックすればよい
全体の計算量はO(n^3)n \leq 300なので十分間に合う
文字で扱うといろいろ面倒なので数字に変換する。

ACコード

感想
stringがキーのmapを持つとTLEしたので注意したい。大小比較でO(|S|), 検索でO(logN)