e543: 00401 - Palindromes

  1. 1. 內容
  2. 2. 範例輸入
  3. 3. 範例輸出
  4. 4. 想法
  5. 5. 程式碼

CPE 一顆星

題目連結:https://zerojudge.tw/ShowProblem?problemid=e543

內容

鏡像字串是一種字串,當該字串的每個元素更改為鏡像(如果它具有鏡像)並且從右到左讀取該字串時,其結果與從左到右讀取原始字串相同。
例如,”3AIAE”是鏡像字符串,因為”A”的鏡像和”I”的鏡像是他們自己,而”3”和”E”為彼此的鏡像。
鏡像迴文是指符合迴文字串標準和鏡像字串標準的字串。
例如,”ATOYOTA”是一個鏡像迴文,”A”、”T”、”O”、”Y”為彼此的鏡像。

以下為有效字元鏡像對應表:

字元 鏡像 字元 鏡像 字元 鏡像 字元 鏡像
A A J L S 2 1 1
B K T T 2 S
C L J U U 3 E
D M M V V 4
E 3 N W W 5 Z
F O O X X 6
G P Y Y 7
H H Q Z 5 8 8
I I R 0 0 9

請注意,”0”(零)和”O”(字母)被視為相同字符,因此只有字母”O”是有效字符。

輸入每列有一個字串 s (1 <= s長度 <= 20)。

對於每個輸入字串,按照以下輸出
此字串屬於鏡像迴文
輸出”s – is a mirrored palindrome.”
此字串屬於鏡像字串
輸出”s – is a mirrored string.”
此字串屬於迴文字串
輸出”s – is a regular palindrome.”
此字串甚麼都不是
輸出”s – is not a palindrome.”
其中s代表原始字串

此外,在每行輸出之後,需要再輸出換行。

範例輸入

NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA

範例輸出

NOTAPALINDROME – is not a palindrome.

ISAPALINILAPASI – is a regular palindrome.

2A3MEAS – is a mirrored string.

ATOYOTA – is a mirrored palindrome.

想法

開局先用 map 將字元和其對應的鏡像字元配對起來。

接著就可以分別從字串的左邊以及右邊開始掃,判斷兩點是否一樣,是否為鏡像關係。

程式碼

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
using namespace std;

int main(){
fastio;
map<char, char> mp;
mp['A'] = 'A', mp['E'] = '3', mp['H'] = 'H', mp['I'] = 'I', mp['J'] = 'L', mp['M'] = 'M', mp['O'] = 'O';
mp['S'] = '2', mp['T'] = 'T', mp['U'] = 'U', mp['V'] = 'V', mp['W'] = 'W', mp['X'] = 'X', mp['Y'] = 'Y', mp['Z'] = '5', mp['0'] = '0';
mp['1'] = '1', mp['2'] = 'S', mp['3'] = 'E', mp['5'] = 'Z', mp['8'] = '8', mp['L'] = 'J';

string s;
int L, R;
bool mstr, rpal;
while(cin >> s){
L = 0, R = s.length()-1;
mstr = rpal = true;
while(L < R){
if(s[L] != s[R]){
rpal = false;
}
if(s[L] != mp[s[R]]){
mstr = false;
}
++L, --R;
}
cout << s << " -- is ";
if(mstr && rpal){
cout << "a mirrored palindrome.\n";
}
else if(mstr){
cout << "a mirrored string.\n";
}
else if(rpal){
cout << "a regular palindrome.\n";
}
else {
cout << "not a palindrome.\n";
}
cout << "\n";
}
return 0;
}