給定 n 個人名和 m 個查詢,每個查詢一個人名,輸出該名字是否在前 n 個名字中出現過。
約束:1 ≤ n ≤ 10000, 1 ≤ m ≤ 1000,名字由大小寫字母組成,長度 ≤ 100。
Input: 5 2 ZhangSan ZhangEr ZhangYi LiSi LiWu ZhangLiu LiWu Output: NO YES
std::map<string, bool> 內部紅黑樹,查找/插入 O(log n);std::unordered_map 哈希表,平均 O(1)。本題數據量 unordered_map 更優,但 map 亦足夠。
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
unordered_map name; // 或 map
string tmp;
for (int i = 0; i < n; ++i) {
cin >> tmp;
name[tmp] = true;
}
for (int i = 0; i < m; ++i) {
cin >> tmp;
if (name.count(tmp)) // 或 name[tmp]
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
cin:類型安全、自動處理空白、配合 sync_with_stdio(false) 速度足夠scanf:C 風格,需字符數組緩衝,scanf("%s", buf) 有緩衝區溢出風險| 特性 | map | unordered_map |
|---|---|---|
| 底層結構 | 紅黑樹 (RB-Tree) | 哈希表 |
| 查找/插入 | O(log n) | 平均 O(1),最壞 O(n) |
| 有序性 | 鍵值有序 | 無序 |
| 適用場景 | 需有序遍歷、範圍查詢 | 純查找/計數、大數據量 |