---
# System prepended metadata

title: UVa 10008 題解 — C++
tags: [CPE 1星]

---

---
title: 'UVa 10008 題解 — C++'
disqus: hackmd
---

# UVa 10008 題解 — C++
:::info
:bulb: 此筆記為UVa 10008的題目詳解，包含解題思路、C++範例程式碼。
:::

## What's Cryptanalysis (ZeroJudge c044.)
### [題目](https://zerojudge.tw/ShowProblem?problemid=c044)
:::success
密碼翻譯（cryptanalysis）是指把某個人寫的密文（cryptographic writing）加以分解。這個程序通常會對密文訊息做統計分析。你的任務就是寫一個程式來對密文作簡單的分析。


:::

### 輸入 / 輸出說明
| **輸入說明** | **輸出說明** |
|:-:|:-:|
| ![image](https://hackmd.io/_uploads/S1wOzOeHC.png) | ![image](https://hackmd.io/_uploads/SJIKGOgHR.png) |

### 解題思路
:::warning
透過 getline(cin, w) 取得輸入字串（若使用 cin >> w，在遇到空格時會結束輸入）。

我透過 code 陣列儲存每個英文字元的出現次數。若該字元為英文字元，則將字元可能出現的最大值 l 設為 l + 1（有可能全部是同個英文字元），再依序從 l ~ 1、A ~ Z 搜尋字元出現次數符合的情況，即可符合題目要求的**出現次數由大到小排列**、**字元出現次數相同，按字元的大小由小到大排列**。

⚠️請注意，如果你使用ZeroJudge平台的 測試執行 功能的時候，發現過不了是正常的，在正式執行時不會有問題。

⚠️請注意，如果你卡在 WA (line:1)，可能是因為輸入時會跳過第一行，因此請添加 cin.ignore(); 。
:::

### 範例程式碼
```C++=
#include <bits/stdc++.h>
using namespace std;

int main ()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int i, j;
	int n, a, l = 0;
	int code[26]={};
	
	cin >> n;
	
	cin.ignore();
	
	string w;
	
	for (i=0;i<n;i++) {
		getline(cin, w);
		
		for (j=0;j<w.size();j++) {
			a = -1;
			
			if (w[j] >= 'a' && w[j] <= 'z')
				a = w[j] - 'a';
			else if (w[j] >= 'A' && w[j] <= 'Z')
				a = w[j] - 'A';
			
			if (a != -1) {
				l++;
				code[a]++;
			}
		}
	}
	
	for (j=l;j>=1;j--) {
		for (i=0;i<26;i++) {
			if (code[i] == j) {
				cout << (char) (i + 'A') << " " << code[i] << endl;
			}
		}
	}

	return 0;
}
```

### 運行結果
<font color="#00BB00">**AC**</font> (3ms, 344KB)

###### tags: `CPE 1星`

:::danger
查看更多資訊請至：https://www.tseng-school.com/
:::