結果
| 問題 |
No.1166 NADA DNA
|
| ユーザー |
|
| 提出日時 | 2020-08-11 15:40:09 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,417 ms / 3,000 ms |
| コード長 | 1,181 bytes |
| コンパイル時間 | 279 ms |
| コンパイル使用メモリ | 82,608 KB |
| 実行使用メモリ | 161,524 KB |
| 最終ジャッジ日時 | 2024-10-09 11:29:32 |
| 合計ジャッジ時間 | 23,360 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
n, l = [int(i) for i in input().split()]
g = [input() for _ in range(n)]
def distant(a, b):
c = 0
for i, j in zip(a, b):
c += i != j
return c
class UnionFind:
def __init__(self, n):
self.parent = [-1] * n
self.rank = [1] * n
def get_root(self, i):
while self.parent[i] != -1:
i = self.parent[i]
return i
def is_same_tree(self, i, j):
return self.get_root(i) == self.get_root(j)
def merge(self, i, j):
i = self.get_root(i)
j = self.get_root(j)
if i == j:
return
if self.rank[i] > self.rank[j]:
self.parent[j] = i
self.rank[i] = max(self.rank[i], self.rank[j] + 1)
else:
self.parent[i] = j
self.rank[j] = max(self.rank[j], self.rank[i] + 1)
uf = UnionFind(n)
cost_vec = [(distant(g[i], g[j]), i, j)
for i in range(n) for j in range(i + 1, n)]
cost_vec.sort()
cost = 0
index = 0
for _ in range(n - 1):
while True:
c, i, j = cost_vec[index]
index += 1
if not uf.is_same_tree(i, j):
break
cost += c
uf.merge(i, j)
print(cost)