# 105正式試題 ## pA. 計算字數 ```python= for _ in range(int(input())): print(len(input().split())) ``` ## pB. 摩斯電碼 ```python= d = {"-----":"0", ".----":"1", "..---":"2", "...--":"3", "....-":"4", ".....":"5", "-....":"6", "--...":"7", "---..":"8", "----.":"9"} for _ in range(int(input())): a = input().split() ans = "" for i in a: ans += d[i] print(ans) ``` ## pC. 網段 ID ```python= for _ in range(int(input())): a, b = input().split("/") a = a.split(".") b = b.split(".") ans = [] for i in range(len(a)): ans.append(str(int(a[i])&int(b[i]))) print(".".join(ans)) ``` ## pD. 最大公約數計算 ```python= def gcd(x, y): while x: x, y = y%x, x return y for _ in range(int(input())): n = [int(i) for i in input().split(",")] ans = 1 for i in range(len(n)): for j in range(i+1, len(n)): ans = max(ans, gcd(min(n[i], n[j]), max(n[i], n[j]))) print(ans) ``` ## pE. 是否為堆積樹 (Heap tree) 或二元搜尋樹 (Binary search tree) ```python= from collections import deque for _ in range(int(input())): n = [int(i) for i in input().split(",")] node = deque([n[0]]) head = 0 flag = True for i in range(len(n)): i += head now = node.popleft() if i+1 >= len(n): break if now > n[i+1]: flag = False break node.append(n[i+1]) if i+2 >= len(n): break if now > n[i+2]: flag = False break node.append(n[i+2]) head += 1 if flag: print("H") else: node = deque([n[0]]) head = 0 flag = True for i in range(len(n)): i += head now = node.popleft() if i+1 >= len(n): break if now < n[i+1]: flag = False break node.append(n[i+1]) if i+2 >= len(n): break if now < n[i+2]: flag = False break node.append(n[i+2]) head += 1 if flag: print("H") if not(flag): node = deque([n[0]]) head = 0 flag = True for i in range(len(n)): i += head now = node.popleft() if i+1 >= len(n): break if now < n[i+1]: print("F") flag = False break node.append(n[i+1]) if i+2 >= len(n): break if now > n[i+2]: print("F") flag = False break node.append(n[i+2]) head += 1 if flag: print("B") ``` ## pF. 後序表示法 (post-order) ```python= def tree(l, m): if not l: return "" root = l[0] node = m.index(root) left_tree = tree(l[1:node+1], m[:node]) right_tree = tree(l[node+1:], m[node+1:]) ans.append(root) return left_tree + right_tree + root for _ in range(int(input())): ans = [] m = input().split(",") l = input().split(",") tree(l, m) print(",".join(ans)) ``` ## pG. 最長共同子序列 (Longest common subsequence) ```python= for _ in range(int(input())): s1 = input() s2 = input() dp = [[0]*(len(s1)+1) for _ in range(len(s2)+1)] for i in range(1, len(s2)+1): for j in range(1, len(s1)+1): if s1[j-1] == s2[i-1]: dp[i][j] = dp[i-1][j-1]+1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) print(dp[-1][-1]) ``` ## pH. 霍夫曼編碼 (Huffman Coding) ```python= class Node: def __init__(self, n, r): self.n = n self.r = r self.left = None self.right = None def visit(self, step): if self.r: vis[ans.index(self.n)] = step if self.left: self.left.visit(step+1) if self.right: self.right.visit(step+1) for _ in range(int(input())): n = [int(i) for i in input().split(",")] ans = n.copy() for i in range(len(n)): n[i] = Node(n[i], 1) while len(n) != 1: n.sort(key=lambda x: x.n, reverse=True) a = n.pop() b = n.pop() new = Node(a.n+b.n, 0) new.left = a new.right = b n.append(new) vis = [0]*(len(ans)) n[0].visit(0) print(",".join(map(str, vis))) ```