結果
問題 |
No.3001 ヘビ文字列
|
ユーザー |
|
提出日時 | 2025-01-07 12:03:44 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,255 bytes |
コンパイル時間 | 1,187 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 325,556 KB |
最終ジャッジ日時 | 2025-01-07 12:06:07 |
合計ジャッジ時間 | 125,541 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 32 WA * 10 TLE * 41 |
ソースコード
#!/usr/bin/env pypy3 def main(): s = input() len_s = len(s) # len_s の約数をすべて求める (1 と len_s 自身は除外する) divisors = [] i = 2 while i * i <= len_s: if len_s % i == 0: divisors.append(i) if i != len_s // i: divisors.append(len_s // i) i += 1 # 約数が小さい順に揃える divisors.sort() # 約数が 1 つも見つからなければ -> 素数とみなし s[0] * len_s を出力して終了 if not divisors: print(s[0] * len_s) return # ここから先は約数がある前提で、元コードのロジックを適用 min_execution = 10**15 # 適当に大きい数で初期化 min_result = None for m in divisors: # m は len_s の約数なので割り切れる n = len_s // m # 各「列」(あるいはブロック位置) ごとに、もっとも頻度の高い文字を探す # A〜Z の文字が 26 種類だけなら配列長は 26 でOK (元コードでは 30 でしたが 26 で十分) unit_result = [] for i in range(m): count_arr = [0] * 26 for j in range(n): ch = s[j*m + i] count_arr[ord(ch) - 65] += 1 # 最頻出文字 (出現回数が最大の文字) を求める max_count = -1 max_char_idx = -1 for idx, cnt in enumerate(count_arr): if cnt > max_count: max_count = cnt max_char_idx = idx # 文字に戻す unit_result.append(chr(max_char_idx + 65)) # 求めた単位文字列を n 回繰り返す unit_str = "".join(unit_result) concat_unit = unit_str * n # 元の文字列との相違数をカウント diff = 0 for i in range(len_s): if s[i] != concat_unit[i]: diff += 1 # 差分が小さいものを最適解として記録 if diff < min_execution: min_execution = diff min_result = concat_unit # 約数の中で最適解だった文字列を出力 print(min_result) if __name__ == "__main__": main()