日期:2026年2月17日
ZeroJudge 題目連結:c077. 00417 - Word Index
解題想法
這題給的條件比較寬鬆,先建表列出所有答案再查表也能通過。但如果能夠找出規律,用數學解會快很多。
Python 程式碼
建表,使用時間約為 31 ms,記憶體約為 15.6 MB,通過測試。
import sys
cnt = 0 # 編號
table = dict() # 表格,內容為{字串: 編號}
# a ~ z 的編號
for i in range(26):
cnt += 1
s = chr(i+ord('a'))
table[s] = cnt
# ab ~ yz 的編號
for i in range(26):
s = chr(i+ord('a'))
for j in range(i+1, 26):
t = s + chr(j+ord('a'))
cnt += 1
table[t] = cnt
# abc ~ xyz 的編號
for i in range(26):
s = chr(i+ord('a'))
for j in range(i+1, 26):
t = s + chr(j+ord('a'))
for k in range(j+1, 26):
u = t + chr(k+ord('a'))
cnt += 1
table[u] = cnt
# abcd ~ wxyz 的編號
for i in range(26):
s = chr(i+ord('a'))
for j in range(i+1, 26):
t = s + chr(j+ord('a'))
for k in range(j+1, 26):
u = t + chr(k+ord('a'))
for x in range(k+1, 26):
v = u + chr(x+ord('a'))
cnt += 1
table[v] = cnt
# abcde ~ vwxyz 的編號
for i in range(26):
s = chr(i+ord('a'))
for j in range(i+1, 26):
t = s + chr(j+ord('a'))
for k in range(j+1, 26):
u = t + chr(k+ord('a'))
for x in range(k+1, 26):
v = u + chr(x+ord('a'))
for y in range(x+1, 26):
w = v + chr(y+ord('a'))
cnt += 1
table[w] = cnt
# 讀取測資並查表輸出答案,如果 key 不在 table 之中則輸出 0
for line in sys.stdin:
print(table.get(line.rstrip(), 0))
數學解,使用時間約為 7 ms,記憶體約為 3 MB,通過測試。
import sys
def comb(n, m): # C n 取 m
if m < 0 or m > n: return 0 # 不合法的算式,回傳 0
m = min(m, n-m) # 取 m, n-m 較小者
ans = 1 # 組合數
for i in range(1, m+1):
ans = ans*(n-i+1)//i
return ans
def calculate_code(s): # 輸入字串,回傳編號
n, code = len(s), 0 # 字串長度,編號
# 檢查字符串是否合法,後面的字元大於前面的字元
for i in range(n-1):
if s[i+1] <= s[i]: # 不合法,回傳 0
return 0
# 計算長度為 1 ~ n-1 的組合數
for i in range(1, n):
code += comb(26, i)
# 計算長度 n 的排名
for i in range(n): # 掃過 s[0] ~ s[n-i]
start = ord('a') if i == 0 else ord(s[i-1]) + 1 # i = 0 從 a 開始,否則從 s[i-1] 下一個開始
end = ord(s[i]) # 到 s[i] 的編號為止
for c in range(start, end):
code += comb(26 - (c-ord('a')+1), n-i-1)
# 最後要再加 1
return code + 1
for line in sys.stdin:
print(calculate_code(line.rstrip()))