UVa401

【题目描述】

传送门

【题目描述】

嘻嘻,自己做直接AC还是比较开心的。当然有一部分原因是之前看书的时候详细看过这个题的代码,但是这已经快一年了,应该说做出这道题凭借的是自己的能力吧。回过身去看了一下书中的代码发现自己写的不算复杂。就是一个简单的模拟。
需要注意的是表里面没有给数字0对应的符号(不会出现),但是自己在根据是数字还是字符进行判断的时候需要按照自己定义的常量数组进行计算,比如我的把0对应的符号设置为空格,所以后面计算的时候加的就是26,而书中加的就是25。

【AC代码】

#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
const char rev[]="A   3  HIL JM O   2TUVWXY5 1SE Z  8 ";
char s[MAXN];
char ans[2][2][100]={"is not a palindrome.","is a mirrored string.","is a regular palindrome.","is a mirrored palindrome."};

int main()
{
	int len,limit;
	bool flag1,flag2;
	char c;
	bool first=true;
	while(~scanf("%s",s))
	{
		flag1=true; flag2=true;
		len=strlen(s);
		limit=(len+1)/2;
		len--;
		for(int i=0;i<limit;i++)
		{
			if(s[i]!=s[len-i]) flag1=false;
			if(s[i]>='A' && s[i]<='Z')
			{
				c=rev[s[i]-'A'];
				if(c!=s[len-i]) flag2=false;
			}
			else if(s[i]>='0' && s[i]<='9')
			{
				c=rev[s[i]-'0'+26];
				if(c!=s[len-i]) flag2=false;
			}
			if(!flag1 && !flag2) break;
		}
//		if(first) first=false;
//		else printf("\n");
		printf("%s -- %s\n\n",s,ans[flag1][flag2]);
	}
	return 0;
}

你可能感兴趣的:(#,算法竞赛入门经典,#,模拟)