Test Message

d586: 哈密瓜美語

內容

「什麼?指導老師哈密瓜…這哪招阿!」
這不是重點,反正哈密瓜老師出來開幼兒美語補習班了。
哈密瓜老師為了加強小朋友的數字和英文字母對應能力,
他出了一道邪惡的謎題…

一般英文字母的排列是 abcdefghijklmnopqrstuvwxyz(a~z)
有種密碼是這樣的,
假如明文是 16 5 14 7 21 9 14,
那麼它的密文就是 penguin。
為什麼呢?因為 p 是第 16 個英文字母,e 是第五個,n 是第 14 個…以此類推

現在邪惡的哈密瓜把英文字母的排列給洗亂了,
並且出了雙向的謎題。
如果題目是由數字組成,就要解出英文單字
如果題目是由小寫字母組成,就要解出數字的總合
假設現在的字母排列是:jvkixcpomtfgdyhesrlzbqnwua
那麼整理出對應表如下:
1 j
2 v
3 k
4 i
5 x
6 c
7 p
8 o
9 m
10 t
11 f
12 g
13 d
14 y
15 h
16 e
17 s
18 r
19 l
20 z
21 b
22 q
23 n
24 w
25 u
26 a
數字:7 16 23 12 25 4 23 答案是 penguin
英文:p e n g u i n 答案是 7+16+23+12+25+4+23=110

好了,照慣例哈密瓜的智商有限,現在他自己也解不出他自己出的謎題了。


輸入

本題有兩個測資點。
第一行有整數 n(1<n<=100),表示總共有幾條謎題
接下來的 n 行,每行有整數 m(1<=m<=10000),
表示接下來有 m 個數字/英文字母要解密。
每個數字或是英文字母會以空格隔開,
並且數字一定在 1~26(包含)
英文字母必定是小寫
並且請注意…
如果題目是數字,程式要轉換成英文字母時,
必須使用的字母排列是:mjqhofawcpnsexdkvgtzblryui
相反的,如果題目給你英文字母,要算出對應數字總和時,
必須使用這套字母排列:uzrmatifxopnhwvbslekycqjgd

2
7 p e n g u i n
7 10 13 11 18 25 26 11

輸出

對應連續的數字,請按照規則排列輸出英文單字(連續無空格)
對應連續的字母,請按照規則排列輸出數字總合
(對範例測資來說,第一筆輸入 penguin 對應的數列是
11 19 12 25 1 7 12,總和是 87)

87
penguin


解題思路

依照題意建好數轉英、英轉數的表,而由於英轉數中的英是被打亂過的哈密瓜英文,所以再用一個正常序列的指標陣列去映射哈密瓜英文(ex : 第 0 項(正常的'a')就映射到哈密瓜英的第 4 項 (哈密瓜英文的'a'))。

建好表之後依照題意做字串處理和判斷即可。


完整程式碼

AC (2ms, 116KB)
#include <stdio.h>

const char n2e[] = "mjqhofawcpnsexdkvgtzblryui", e2n[] = "uzrmatifxopnhwvbslekycqjgd";
const char* e2e[] = { e2n + 4, e2n + 15, e2n + 21, e2n + 25, e2n + 18, e2n + 7, e2n + 24, e2n + 12,
e2n + 6, e2n + 23, e2n + 19, e2n + 17, e2n + 3, e2n + 11, e2n + 9, e2n + 10, e2n + 22,
e2n + 2, e2n + 16, e2n + 5, e2n + 0, e2n + 14, e2n + 13, e2n + 8, e2n + 20, e2n + 1 };
char input[30030], output[10010];

inline char* getUInt(char buffer[], unsigned int* dst)
{
while (*buffer < '0')
if (!*buffer++) return NULL;
*dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
return buffer;
}

int main()
{
int n, m, tmp, sum;
char* st, * oTop;
scanf(" %d", &n);
getchar();
while (n--)
{
sum = 0;
gets(input);
st = getUInt(input, &m) + 1;
if (st[0] < 'a')
{
oTop = output;
for (int i = 0; i < m; i++)
st = getUInt(st, &tmp), * oTop++ = n2e[tmp - 1];
*oTop = '\0';
}
else
{
for (int i = 0; i < m; i++)
sum += e2e[*st - 'a'] - e2n + 1, st += 2;
}
sum ? printf("%d\n", sum) : puts(output);
}
return 0;
}