/******************************************* Problem:UVA OJ-401 Palindromes Date:11/07/2014 Author:Praker ********************************************/ #include <stdio.h> #include <string.h> #define maxn 10000 char str[maxn]; char ch_1[14]="AHIMOTUVWXY18"; char ch[22]="AEHILJMOSTUVWXYZ12358"; char chRe[22]="A3HILJMO2TUVWXY51SEZ8"; int is_P(char* str,int n); int is_M(char* str,int n); int hasRe_1(char c); int hasRe(char c); char getRe(char c); int main() { while(gets(str)!=NULL) { int len=strlen(str); if(len==0) break; int isMirro=0,isPalin=0; int i=0; isPalin=is_P(str,len); isMirro=is_M(str,len); if(isPalin==0) { if(isMirro==0)printf("%s--is not a palindrome.\n\n",str); else printf("%s--is a mirrored string.\n\n",str); } else { if(isMirro==0)printf("%s--is a regular palindrome.\n\n",str); else printf("%s--is a mirrored palindrome.\n\n",str); } } } int is_P(char* str,int n) { int i; for(i=0;i<n/2;i++) if(str[i]!=str[n-1-i]) return 0; return 1; } int is_M(char* str,int n) { if(n==1) { if(hasRe_1(str[0])) return 1; else return 0; } for(int i=0;i<n/2;i++) { if(hasRe(str[i])) { char t=getRe(str[i]); if(t!=str[n-1-i]) return 0; } else return 0; } if(n%2!=0) { int x=n/2; if(hasRe_1(str[x])) return 1; else return 0; } return 1; } int hasRe_1(char c) { int has=0; for(int i=0;i<13;i++) if(ch_1[i]==c) has=1; return has; } int hasRe(char c) { int has=0; for(int i=0;i<22;i++) if(ch[i]==c) has=1; return has; } char getRe(char c) { for(int i=0;i<22;i++) if(ch[i]==c) return chRe[i]; }