---
# System prepended metadata

title: 'CPE 解題分享 - UVa.401 Palindromes '
tags: [UVA, CPE]

---

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

以下為有效字元鏡像對應表：
![image](https://hackmd.io/_uploads/r1vejF3jA.png)
請注意，"0"(零)和"O"(字母)被視為相同字符，因此只有字母"O"是有效字符。

# 思路
分別鏡像迴文和迴文為兩個 *bool 函式* ，依照字串的技巧運算得出其解，最後，回到 *answer()* 輸出。 
# Code
```C++=1
#include <iostream>
#include <string>

using ss=std::string;

class check{

private:
  ss ans, Reverse;
  
public:
  ss reverse(ss original){
    for(char &c:original)
      switch(c){
        case 'E':c='3';break;case '3':c='E';break;
        case 'J':c='L';break;case 'L':c='J';break;
        case 'S':c='2';break;case '2':c='S';break;
        case 'Z':c='5';break;case '5':c='Z';break;
      }
    return ss(original.rbegin(),original.rend());
  }
  
  bool ismirrored(const ss original){
    return original==reverse(original);
  }
  
  bool ispalindrome(const ss original,const ss Reverse){
    return original==Reverse;
  }
  
  ss answer(ss original){
    Reverse=ss(original.rbegin(),original.rend());
    bool ismir=ismirrored(original), ispalin=ispalindrome(original,Reverse);
    ans=(ismir&&ispalin?"is a mirrored palindrome.":
    	 ismir?"is a mirrored string.":
    	 ispalin?"is a regular palindrome.":
    	 "is not a palindrome.");
    return ans; 
  }
}Checker;

int main()
{ ss original;
  
  while(std::cin>>original){
    std::cout<<original<<" -- "<<Checker.answer(original)<<"\n"<<"\n";   
  }
}


```