---
# System prepended metadata

title: 0-21 map
tags: [演算法, C++, APCS, Python]

---

# 0-21 map

講義不是我寫的，網址在此 https://emanlaicepsa.github.io/2020/10/21/0-index/
我只是將自己寫的練習題程式碼記錄下來。
最後更新日期：2024年10月9日

## [TOJ: 55](https://toj.tfcis.org/oj/pro/55/)

本題在〈[0-14 常用工具/函式](https://hackmd.io/@yizhewang/ByFcXglJ1g)〉中有出現過，當時是用 Python 的 bisect 函式庫及 C++ 的 algorithm 函式庫工具解題。

### Python 程式碼

用 collections 函式庫的 Counter 計數，但是第3筆測資記憶體爆掉。
```python=
from collections import Counter

n = int(input())
songs = list(map(int, input().split()))
cnt = Counter(songs)
m = int(input())
for _ in range(m):
    print(cnt[int(input())])
```

### C++ 程式碼

用 map 字典計數，執行時間最久約為 1697 ms，使用記憶體最多約為 48944 kB，通過測試。
```cpp=
#include <iostream>
#include <map>
using namespace std;

int main() {
    ios::sync_with_stdio(0),cin.tie(0);
    int N, M, song; cin >> N;
    map<int, int> songs;
    for(int i=0; i<N; i++) {
        cin >> song;
        songs[song]++;
    }
    cin >> M;
    for(int i=0; i<M; i++) {
        cin >> song;
        cout << songs[song] << "\n";
    }
    return 0;
}
```

用 unordered_map 字典計數會更快，執行時間最久約為 784 ms，使用記憶體最多約為 40604 kB，通過測試。
```cpp=
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    ios::sync_with_stdio(0),cin.tie(0);
    int N, M, song; cin >> N;
    unordered_map<int, int> songs;
    for(int i=0; i<N; i++) {
        cin >> song;
        songs[song]++;
    }
    cin >> M;
    for(int i=0; i<M; i++) {
        cin >> song;
        cout << songs[song] << "\n";
    }
    return 0;
}
```

## [ZeroJudge: d518. 文字抄寫 II](https://zerojudge.tw/ShowProblem?problemid=d518)

### Python 程式碼

執行時間最久約為 2.2 s，使用記憶體最多約為 3.5 MB，通過測試。
```python=
import sys

for line in sys.stdin:
    N = int(line)
    words = {}
    i = 1
    for _ in range(N):
        word = input()
        if word not in words:
            words[word] = i
            print("New! {:d}".format(words[word]))
            i += 1
        else:
            print("Old! {:d}".format(words[word]))
```

### C++ 程式碼

執行時間最久約為 0.5 s，使用記憶體最多約為 1.2 MB，通過測試。
```cpp=
#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(0),cin.tie(0);
    int N;
    while(cin >> N) {
        string word;
        map<string, int> words;
        int idx = 1;
        for(int i=0; i<N; i++) {
            cin >> word;
            auto it = words.find(word);
            if (it == words.end()) {
                words.emplace(word, idx);
                cout << "New! " << words[word] << "\n";
                idx++;
            } else {
                cout << "Old! " << words[word] << "\n";
            }
        }
    }
    return 0;
}
```

改用 unordered_map 會比較快，執行時間最久約為 0.3 s，使用記憶體最多約為 2.1 MB，通過測試。
```cpp=
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(0),cin.tie(0);
    int N;
    while(cin >> N) {
        string word;
        unordered_map<string, int> words;
        int idx = 1;
        for(int i=0; i<N; i++) {
            cin >> word;
            auto it = words.find(word);
            if (it == words.end()) {
                words.emplace(word, idx);
                cout << "New! " << words[word] << "\n";
                idx++;
            } else {
                cout << "Old! " << words[word] << "\n";
            }
        }
    }
    return 0;
}
```

------

###### tags:`演算法`、`APCS`、`Python`、`C++`