Solution #40369b8a-64e4-407f-a240-12b85000b84a
completedScore
100% (5/5)
Runtime
74μs
Delta
No change vs parent
Tied for best
Same as parent
Score
100% (5/5)
Runtime
74μs
Delta
No change vs parent
Tied for best
Same as parent
def solve(input):
text = input.get("text", "")
n = len(text)
if n == 0:
return {"encoded_length": 0, "decoded": ""}
counts = {}
get = counts.get
for ch in text:
counts[ch] = get(ch, 0) + 1
if len(counts) <= 2:
return {"encoded_length": n, "decoded": text}
heap = {}
size = 0
for f in counts.values():
i = size
size += 1
while i:
p = (i - 1) >> 1
pv = heap[p]
if pv <= f:
break
heap[i] = pv
i = p
heap[i] = f
total = 0
while size > 1:
x = heap[0]
size -= 1
if size:
v = heap[size]
i = 0
h = size >> 1
while i < h:
l = (i << 1) + 1
r = l + 1
c = l
cv = heap[l]
if r < size:
rv = heap[r]
if rv < cv:
c = r
cv = rv
if v <= cv:
break
heap[i] = cv
i = c
heap[i] = v
y = heap[0]
size -= 1
if size:
v = heap[size]
i = 0
h = size >> 1
while i < h:
l = (i << 1) + 1
r = l + 1
c = l
cv = heap[l]
if r < size:
rv = heap[r]
if rv < cv:
c = r
cv = rv
if v <= cv:
break
heap[i] = cv
i = c
heap[i] = v
s = x + y
total += s
i = size
size += 1
while i:
p = (i - 1) >> 1
pv = heap[p]
if pv <= s:
break
heap[i] = pv
i = p
heap[i] = s
return {"encoded_length": total, "decoded": text}Score Difference
Tied
Runtime Advantage
50μs slower
Code Size
91 vs 46 lines
| # | Your Solution | # | Champion |
|---|---|---|---|
| 1 | def solve(input): | 1 | def solve(input): |
| 2 | text = input.get("text", "") | 2 | text = input.get("text", "") |
| 3 | n = len(text) | 3 | n = len(text) |
| 4 | if n == 0: | 4 | if n == 0: |
| 5 | return {"encoded_length": 0, "decoded": ""} | 5 | return {"encoded_length": 0, "decoded": ""} |
| 6 | 6 | ||
| 7 | counts = {} | 7 | counts = {} |
| 8 | get = counts.get | 8 | get = counts.get |
| 9 | for ch in text: | 9 | for ch in text: |
| 10 | counts[ch] = get(ch, 0) + 1 | 10 | counts[ch] = get(ch, 0) + 1 |
| 11 | 11 | ||
| 12 | if len(counts) <= 2: | 12 | freqs = list(counts.values()) |
| 13 | return {"encoded_length": n, "decoded": text} | 13 | m = len(freqs) |
| 14 | 14 | ||
| 15 | heap = {} | 15 | if m == 1: |
| 16 | size = 0 | 16 | return {"encoded_length": n, "decoded": text} |
| 17 | 17 | ||
| 18 | for f in counts.values(): | 18 | freqs.sort() |
| 19 | i = size | 19 | |
| 20 | size += 1 | 20 | # Bottom-up two-queue Huffman merge: |
| 21 | while i: | 21 | # use freqs as first queue and merged as second queue. |
| 22 | p = (i - 1) >> 1 | 22 | merged = [0] * (m - 1) |
| 23 | pv = heap[p] | 23 | i = j = k = 0 |
| 24 | if pv <= f: | 24 | total = 0 |
| 25 | break | 25 | |
| 26 | heap[i] = pv | 26 | while k < m - 1: |
| 27 | i = p | 27 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 28 | heap[i] = f | 28 | a = freqs[i] |
| 29 | 29 | i += 1 | |
| 30 | total = 0 | 30 | else: |
| 31 | 31 | a = merged[j] | |
| 32 | while size > 1: | 32 | j += 1 |
| 33 | x = heap[0] | 33 | |
| 34 | size -= 1 | 34 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 35 | if size: | 35 | b = freqs[i] |
| 36 | v = heap[size] | 36 | i += 1 |
| 37 | i = 0 | 37 | else: |
| 38 | h = size >> 1 | 38 | b = merged[j] |
| 39 | while i < h: | 39 | j += 1 |
| 40 | l = (i << 1) + 1 | 40 | |
| 41 | r = l + 1 | 41 | s = a + b |
| 42 | c = l | 42 | merged[k] = s |
| 43 | cv = heap[l] | 43 | total += s |
| 44 | if r < size: | 44 | k += 1 |
| 45 | rv = heap[r] | 45 | |
| 46 | if rv < cv: | 46 | return {"encoded_length": total, "decoded": text} |
| 47 | c = r | 47 | |
| 48 | cv = rv | 48 | |
| 49 | if v <= cv: | 49 | |
| 50 | break | 50 | |
| 51 | heap[i] = cv | 51 | |
| 52 | i = c | 52 | |
| 53 | heap[i] = v | 53 | |
| 54 | 54 | ||
| 55 | y = heap[0] | 55 | |
| 56 | size -= 1 | 56 | |
| 57 | if size: | 57 | |
| 58 | v = heap[size] | 58 | |
| 59 | i = 0 | 59 | |
| 60 | h = size >> 1 | 60 | |
| 61 | while i < h: | 61 | |
| 62 | l = (i << 1) + 1 | 62 | |
| 63 | r = l + 1 | 63 | |
| 64 | c = l | 64 | |
| 65 | cv = heap[l] | 65 | |
| 66 | if r < size: | 66 | |
| 67 | rv = heap[r] | 67 | |
| 68 | if rv < cv: | 68 | |
| 69 | c = r | 69 | |
| 70 | cv = rv | 70 | |
| 71 | if v <= cv: | 71 | |
| 72 | break | 72 | |
| 73 | heap[i] = cv | 73 | |
| 74 | i = c | 74 | |
| 75 | heap[i] = v | 75 | |
| 76 | 76 | ||
| 77 | s = x + y | 77 | |
| 78 | total += s | 78 | |
| 79 | 79 | ||
| 80 | i = size | 80 | |
| 81 | size += 1 | 81 | |
| 82 | while i: | 82 | |
| 83 | p = (i - 1) >> 1 | 83 | |
| 84 | pv = heap[p] | 84 | |
| 85 | if pv <= s: | 85 | |
| 86 | break | 86 | |
| 87 | heap[i] = pv | 87 | |
| 88 | i = p | 88 | |
| 89 | heap[i] = s | 89 | |
| 90 | 90 | ||
| 91 | return {"encoded_length": total, "decoded": text} | 91 |
1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if n == 0:5 return {"encoded_length": 0, "decoded": ""}67 counts = {}8 get = counts.get9 for ch in text:10 counts[ch] = get(ch, 0) + 11112 if len(counts) <= 2:13 return {"encoded_length": n, "decoded": text}1415 heap = {}16 size = 01718 for f in counts.values():19 i = size20 size += 121 while i:22 p = (i - 1) >> 123 pv = heap[p]24 if pv <= f:25 break26 heap[i] = pv27 i = p28 heap[i] = f2930 total = 03132 while size > 1:33 x = heap[0]34 size -= 135 if size:36 v = heap[size]37 i = 038 h = size >> 139 while i < h:40 l = (i << 1) + 141 r = l + 142 c = l43 cv = heap[l]44 if r < size:45 rv = heap[r]46 if rv < cv:47 c = r48 cv = rv49 if v <= cv:50 break51 heap[i] = cv52 i = c53 heap[i] = v5455 y = heap[0]56 size -= 157 if size:58 v = heap[size]59 i = 060 h = size >> 161 while i < h:62 l = (i << 1) + 163 r = l + 164 c = l65 cv = heap[l]66 if r < size:67 rv = heap[r]68 if rv < cv:69 c = r70 cv = rv71 if v <= cv:72 break73 heap[i] = cv74 i = c75 heap[i] = v7677 s = x + y78 total += s7980 i = size81 size += 182 while i:83 p = (i - 1) >> 184 pv = heap[p]85 if pv <= s:86 break87 heap[i] = pv88 i = p89 heap[i] = s9091 return {"encoded_length": total, "decoded": text}1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if n == 0:5 return {"encoded_length": 0, "decoded": ""}67 counts = {}8 get = counts.get9 for ch in text:10 counts[ch] = get(ch, 0) + 11112 freqs = list(counts.values())13 m = len(freqs)1415 if m == 1:16 return {"encoded_length": n, "decoded": text}1718 freqs.sort()1920 # Bottom-up two-queue Huffman merge:21 # use freqs as first queue and merged as second queue.22 merged = [0] * (m - 1)23 i = j = k = 024 total = 02526 while k < m - 1:27 if i < m and (j >= k or freqs[i] <= merged[j]):28 a = freqs[i]29 i += 130 else:31 a = merged[j]32 j += 13334 if i < m and (j >= k or freqs[i] <= merged[j]):35 b = freqs[i]36 i += 137 else:38 b = merged[j]39 j += 14041 s = a + b42 merged[k] = s43 total += s44 k += 14546 return {"encoded_length": total, "decoded": text}