1 /*
2 描述
3 输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
4 输入
5 输入一个测试数据n(1<=n<=10);
6 随后有n行,每行有一个字符串。
7 输出
8 输出所要求的回文子串。
9 样例输入
10 1
11 Confuciuss say:Madam,I'm Adam.样例输出
12 Madam,I'm Adam
13 */
14 #include<stdio.h>
15 #include<string.h>
16
17 char a[5050];
18 char b[5050];
19 int p[5050];
20
21 void fun()
22 {
23 int i,j,n,max,x,y;
24 n=strlen(a);
25 for(i=0,j=0;i<n;i++)
26 {
27 if(a[i]>='a'&&a[i]<='z')
28 {
29 p[j]=i;
30 b[j++]=a[i];
31 }
32 else if(a[i]>='A'&&a[i]<='Z')
33 {
34 p[j]=i;
35 b[j++]=a[i]+32;
36 }
37 }
38 n=j;
39 max=0;
40 for(i=0;i<n;i++)
41 {
42 for(j=0;i-j>=0&&i+j<n;j++)
43 {
44 if(b[i-j]!=b[i+j]) break;
45 if(j*2+1>max)
46 {
47 max=j*2+1;
48 x=p[i-j];
49 y=p[i+j];
50 }
51 }
52 for(j=0;i-j>=0&&i+j+1<n;j++)
53 {
54 if(b[i-j]!=b[i+j+1]) break;
55 if(j*2+2>max)
56 {
57 max=j*2+2;
58 x=p[i-j];
59 y=p[i+j+1];
60 }
61 }
62 }
63 for(i=x;i<=y;i++)
64 printf("%c",a[i]);
65 printf("\n");
66 }
67 int main()
68 {
69 int t;
70 scanf("%d",&t);
71 getchar();
72 while(t--)
73 {
74 gets(a);
75 fun();
76 }
77 return 0;
78 }