# 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)))
```