---
# System prepended metadata

title: UVA 10008 - What's Cryptanalysis?
tags: [map, CPE]

---

## UVA 10008 - What's Cryptanalysis?
### 題意:
###### 計算 l (這是line的簡寫，不是數字1) 行句子裡面的字母數量，由多到少排列，如果出現次數相同，則照字母排列 (alphabetical order)。
### Sample Input:
###### 這裡有特別註明有可能會有句子裡面沒有任何字元，但這會算作一行。
```=
3
This is a test.
Count me 1 2 3 4 5.
Wow!!!! Is this question easy?
```
### Sample Output:
```=
S 7
T 6
I 5
E 4
O 3
A 2
H 2
N 2
U 2
W 2
C 1
M 1
Q 1
Y 1
```
### 程式碼:
```cpp=
#include <iostream>
#include <map>
#include <string>
#define haku author
using namespace std;

int main() {
    int l, max = 0; string str;
    map<char, int> mp;    // 我想不到怎麼命名了XD
    getline(cin, str); l = stoi(str);
    while(l--) {
        getline(cin, str);
        for(int i = 0; i < str.size(); i++) {
            // 感覺這裡可以更簡潔，之後再來看看
            if (str[i] >= 'a' && str[i] <= 'z'){
                char tmp = str[i] - 'a' + 'A';
                if (mp.find(tmp) != mp.end()) mp[tmp]++;
                else mp.insert({tmp, 1});
                
                if (mp[tmp] > max) max = mp[tmp];
            }
            else if (str[i] >= 'A' && str[i] <= 'Z') {
                if (mp.find(str[i]) != mp.end()) mp[str[i]]++;
                else mp.insert({str[i], 1});
                
                if (mp[str[i]] > max) max = mp[str[i]];
            }
        }
    }
    while(max) {
        for(auto& p: mp) {
            if (p.second == max) cout << p.first << ' ' << p.second << endl;
        }
        max--;
    }
    return 0;
}
```
#### 更新:
###### 找到更簡潔的寫法了，但要記個東西 
###### <cctype> 裡面的 toupper() (轉大寫) 和 isalpha() (判斷是否為英文字母) 另外可以多記一個 tolower()，也蠻常用到的。

```cpp=
#include <iostream>
#include <map>
#include <string>
#include <cctype>   // for isalpha() & tolower()
#include <vector>
#include <algorithm>
#define haku author
using namespace std;

bool cmp(pair<char, int> a, pair<char, int> b) {
	if (a.second != b.second) return a.second > b.second;
	return a.first < b.first;
}
                             
int main() {
    int l, max = 0; string str;
    map<char, int> mp;    // 我想不到怎麼命名了XD
    getline(cin, str); l = stoi(str);
    while (l--) {
        getline(cin, str);
        for (int i = 0; i < str.size(); i++) {
            if (isalpha(str[i])) {
                char tmp = toupper(str[i]);
                if (mp.find(tmp) != mp.end()) mp[tmp]++;
                else mp.insert({ tmp, 1 });
                if (max < mp[tmp]) max = mp[tmp];   // 紀錄最大值是多少
            }
        }
    }
    vector<pair<char, int>> v(mp.begin(), mp.end());
    sort(v.begin(), v.end(), cmp);

    for (auto& p : v) {
	    cout << p.first << ' ' << p.second << endl;
    }
    return 0;
}
```