結果
| 問題 | No.3805 Crossword Key Maker |
| ユーザー |
|
| 提出日時 | 2026-10-06 16:50:58 |
| 言語 | Python3 (3.15.2 + numpy 2.5.4 + scipy 1.18.1 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 24 ms / 2,000 ms |
| + 290µs | |
| コード長 | 1,848 bytes |
| 記録 | |
| コンパイル時間 | 57 ms |
| コンパイル使用メモリ | 15,104 KB |
| 実行使用メモリ | 11,520 KB |
| 最終ジャッジ日時 | 2026-11-14 14:31:29 |
| 合計ジャッジ時間 | 3,807 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 43 |
ソースコード
import sys
def solve():
input = sys.stdin.read
data = input().split()
if not data:
return
H = int(data[0])
W = int(data[1])
S = data[2:]
# カギの始点を管理する配列
# 各マスが横・縦のカギの始点かどうかを調べる
is_horiz_start = [[False] * W for _ in range(H)]
is_vert_start = [[False] * W for _ in range(H)]
horiz_len = {}
vert_len = {}
for i in range(H):
for j in range(W):
if S[i][j] == ".":
# 横のカギの始点判定
is_h = (j == 0 or S[i][j - 1] == "#") and (
j + 1 < W and S[i][j + 1] == "."
)
if is_h:
is_horiz_start[i][j] = True
# 長さを計算
length = 0
jj = j
while jj < W and S[i][jj] == ".":
length += 1
jj += 1
horiz_len[(i, j)] = length
# 縦のカギの始点判定
is_v = (i == 0 or S[i - 1][j] == "#") and (
i + 1 < H and S[i + 1][j] == "."
)
if is_v:
is_vert_start[i][j] = True
# 長さを計算
length = 0
ii = i
while ii < H and S[ii][j] == ".":
length += 1
ii += 1
vert_len[(i, j)] = length
# 添字の割り当て (上から、同じ行は左から)
keys = []
for i in range(H):
for j in range(W):
if is_horiz_start[i][j] or is_vert_start[i][j]:
keys.append((i, j))
K = len(keys)
print(K)
for idx, (i, j) in enumerate(keys):
r_str = "-"
c_str = "-"
if is_horiz_start[i][j]:
L = horiz_len[(i, j)]
# 長さ L の適当な文字列を作る (例: 'a' が L 個)
r_str = "a" * L
if is_vert_start[i][j]:
L = vert_len[(i, j)]
c_str = "a" * L
print(f"{r_str} {c_str}")
if __name__ == "__main__":
solve()