合法單詞:長度 1~5,由小寫字母組成,字母嚴格遞增(如 `abc`, `gwz` 合法;`aab`, `cat` 非法)。所有合法單詞按字典序排列編號從 1 開始。輸入一單詞,若非法輸出 0,否則輸出其編號。
對單詞 `s[0..len-1]`(0-based):
#includeusing namespace std; int C[27][27]; void initComb() { for (int i = 0; i <= 26; ++i) { C[i][0] = C[i][i] = 1; for (int j = 1; j < i; ++j) C[i][j] = C[i-1][j] + C[i-1][j-1]; } } int main() { initComb(); string s; while (cin >> s) { int len = s.size(); bool valid = true; for (int i = 1; i < len; ++i) if (s[i] <= s[i-1]) { valid = false; break; } if (!valid) { cout << 0 << '\n'; continue; } int rank = 0; for (int i = 1; i < len; ++i) rank += C[26][i]; char prev = 'a' - 1; for (int i = 0; i < len; ++i) { for (char ch = prev + 1; ch < s[i]; ++ch) rank += C['z' - ch][len - 1 - i]; prev = s[i]; } cout << rank + 1 << '\n'; } return 0; }
組合數計數經典應用。嚴格遞增單詞 ↔ 組合選擇,排名計算 = 短單詞數 + 同長度字典序前單詞數。掌握「按位累加組合數」模板,可解決所有「字典序排名/第 k 個組合」類問題。