HDU 1004 題目要求統計多組測試數據中出現次數最多的氣球顏色字符串。本文提供基於二維字符數組 + 計數數組的直觀 O(n²) 解法,並分析優化方向(哈希表/Trie 樹),適合 ACM 入門練習。
#include <stdio.h>
#include <string.h>
int main() {
int n;
char color[1000][16]; // 15字符 + \0
int cnt[1000];
while (scanf("%d", &n) == 1 && n) {
// 讀入並初始化計數
for (int i = 0; i < n; i++) {
scanf("%15s", color[i]); // 限制寬度防溢出
cnt[i] = 0;
}
// 兩兩比較計數
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (strcmp(color[i], color[j]) == 0) {
cnt[i]++;
}
}
}
// 找最大計數對應的顏色
int max_idx = 0;
for (int i = 1; i < n; i++) {
if (cnt[i] > cnt[max_idx]) max_idx = i;
}
printf("%s\n", color[max_idx]);
}
return 0;
}
| 方法 | 時間複雜度 | 實現要點 |
|---|---|---|
| 哈希表 | O(N × L) 平均 | 自定義字符串哈希(如 DJB2),處理衝突(鏈表/開放定址) |
| Trie 字典樹 | O(N × L) | 每個節點 26 個子指針 + 計數器,適合大量字符串前綴查詢 |
| 排序後計數 | O(N log N × L) | `qsort` + `strcmp` 排序,相同字符串相鄰,單次遍歷計數 |
| C++ STL `unordered_map` | O(N × L) 平均 | `unordered_map |
int cmp_str(const void *a, const void *b) {
return strcmp((const char*)a, (const char*)b);
}
// 在 while 循環內:
qsort(color, n, 16, cmp_str); // 排序
int max_cnt = 1, cur_cnt = 1;
char *max_color = color[0];
for (int i = 1; i < n; i++) {
if (strcmp(color[i], color[i-1]) == 0) {
cur_cnt++;
} else {
cur_cnt = 1;
}
if (cur_cnt > max_cnt) {
max_cnt = cur_cnt;
max_color = color[i];
}
}
printf("%s\n", max_color);
HDU 1004 是字符串統計入門好題。暴力 O(N²) 在數據範圍內完全可接受,代碼簡短直觀。進階可練習 `qsort`+排序計數、哈希表、Trie 樹等高效結構,為後續大規模字符串處理打基礎。