#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,l,k,ok;
char s[1010],s1[1010],s2[1010];
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
{
ok=1;
scanf("%s",s);
l=strlen(s);
for(j=0;j<=l-1;j++)
if(s[j]!=s[l-1-j])ok=0;
if(ok==0)printf("Case #%d: Not Palindrome\n",i);
else if(l%2==0)
{
ok=2;
for(j=0;j<l/2;j++)
s1[j]=s[j];
s1[l/2]='\0';
k=0;
for(j=l/2;j<l;j++)
{
s2[k]=s[j];
k++;
}
s2[l/2]='\0';
for(j=0;j<l/2;j++)
if(s1[j]!=s1[l/2-1-j]||s2[j]!=s2[l/2-1-j])ok=1;
}
if(ok==1)printf("Case #%d: Single Palindrome\n",i);
else if(ok==2)printf("Case #%d: Double Palindrome\n",i);
}
}
return 0;
}
关于回文串
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
对于一个字符串如果从前往后读和从后往前读是一样的,那么我们就叫他回文串; 在此基础上,如果把一个回文串拿出前l/2部分和后l/2部分,分别组成的两个子串都是回文串,则这个回文串可称为双回文串。 请编程判断给定字符串的类型。
Input
题目包含多组测试数据,第一行有一个整数t(1<=t<=15)代表case数量,每组case包含一段长度不超过1000的字符串。
Output
每个case的输出格式形如"Case #K: M",K代表case数,从1开始,M表示字符串类型,如果给的字符串是双回文串,则输出"Double Palindrome",如果是回文串但不是双回文串则输出"Single Palindrome",如果不是回文串就输出"Not Palindrome";
Sample Input
3 kid1dik kikkik dala
Sample Output
Case #1: Single Palindrome Case #2: Double Palindrome Case #3: Not Palindrome