---
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)加以分解。這個程序通常會對密文訊息做統計分析。你的任務就是寫一個程式來對密文作簡單的分析。
:::
### 輸入 / 輸出說明
| **輸入說明** | **輸出說明** |
|:-:|:-:|
|  |  |
### 解題思路
:::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/
:::