题目描述
一个规则的回文是一串由字符或数字组成的字符串,从前往后读与从后往前读完全一样。例如,字符串“ABCDEDCBA”就是个回文字符串,从左到右和从右到左都是一样的。
所谓镜像字符串,就是将字符串中的每个字符用对应的相反字符(如果存在相反字符)替换后,得到的新字符串从后往前读,跟原来的字符串一样。例如,3AIAE就是一个镜像字符串,因为A和I是它们本身的相反字符,并且3和E互为相反字符。字符串3AIAE中,各字符转换成其相反字符后,变成EAIA3,这个字符串从后往前读,就是原来的字符串。
镜像回文就是同时满足回文字符串和镜像字符串条件的字符串。例如,ATOYOTA就是一个镜像回文,因为这个字符从后往前读和原来的一样,替换成相反字符后,得到ATOYOTA,从后往前读也和原来的一样。
注意:数字0和字符O被认为是同一个字符,因此只有字符O才是有效的字符。
输入
输入文件包括多个字符串,每行一个,每个字符串包含1~20个有效字符,不会包含无效字符。输入数据一直到文件尾。
输出
对输入的每个字符串,在第1列开始输出字符串本身,接着输出以下字符串中的一个:
“ -- is not a palindrome.” 既不是回文,也不是镜像字符串
“ -- is a regular palindrome.”是回文,但不是镜像字符串
“ -- is a mirrored string.”不是回文,但是镜像字符串
“ -- is a mirrored palindrome.”既是回文也是镜像字符串
注意:请按照输出输出样例空格和字符“-”,每个输出后有一个空行。
样例输入 复制
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
样例输出 复制
NOTAPALINDROME -- is not a palindrome.
ISAPALINILAPASI -- is a regular palindrome.
2A3MEAS -- is a mirrored string.
ATOYOTA -- is a mirrored palindrome.
#include<iostream>
#include<string>
#include<vector>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
//用常量数组存储对应镜像
const string rev="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
//对应于多个0,1变化量
const vector<string> msg={"is not a palindrome.",
"is a regular palindrome.",
"is a mirrored string.",
"is a mirrored palindrome."};
char r(char ch)
{
if(isalpha(ch)) return rev[ch-'A'];
return rev[ch-'0'+25];
}
int main()
{
string s;
while(cin>>s)
{
int p=1,m=1;
int len=s.size();
for(int i=0;i<len;++i)
{
if(s[i]!=s[len-1-i]) p=0; //不是回文串
if(r(s[i])!=s[len-1-i]) m=0; //不是镜像串
}
cout<<s<<" -- "<<msg[m*2+p]<<endl<<endl;
}
return 0;
}