Time Limit:1000MS
Description:
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?Input:
测试数据有若干行字符串,包括字母,数字,符号。(字母区分大小写)Output:
与输入相对应每一行输出一个整数,代表最长有效密码串的长度。Sample Input:
ABBA
12ABBA
A
ABAKK
51233214
abaaab
Sample Output:
4
4
1
3
6
5
#include<stdio.h>
#include<string.h>
int work(
int
m,
char
*
a)
{
int
i,j,k1=
0,k2;
if(a[m]
==
a[m+
1])
{
j
=
m+
2;
i
=
m-
1;
while(i>=
0
&&
a[j]!=
'\0'&&a[i]
==
a[j])
{
i--;
j++;
}
k1
=
j-i-
1;
}
i
=
m-
1;
j
=
m+
1;
k2
=
0;
while(i>=
0
&&
a[j]!=
'\0'&&a[i]
==
a[j])
{
i--;
j++;
}
k2
=
j-i-
1;
if(k2
==
0
&&k1
==
0)
//如果k1,k2为0,说明不存在回文,长度为1
return
1;
return
k1>k2?k1:k2;
}
int main(
void)
{
char
a[
300];
int
i,max,num;
while(gets(a))
{
max
=
num
=
0;
for(i=
0;a[i]!=
'\0';i++)
{
num
=
work(i,a);
if(num>max)
max
=
num;
}
printf(
"%d
\n
",max);
memset(a,
0,
sizeof(a));
}
return
0;
}
#include<string.h>
int
{
}
int
{
}
改进后的代码:
#include<stdio.h>
#include<string.h>
int main(
void)
{
char
a[
300];
int
i,j,max,num,m;
while(gets(a))
{
max
=
num
=
0;
m
=
strlen(a);
for(i=
0;i<m;i++)
{
for(j=
0;i-j>=
0
&&
i+j<m;j++)
//对奇数的处理
{
if(a[i-j]!=a[i+j])
break;
if(
2*j+
1>max)
max
=
2*j+
1;
}
for(j=
0;i-j>=
0
&&
i+j+
1<m;j++)
//对偶数的处理
{
if(a[i-j]!=a[i+j+
1])
break;
if(
2*j+
2>max)
max
=
2*j+
2;
}
}
printf(
"%d
\n
",max);
memset(a,
0,
sizeof(a));
}
return
0;
}
转自http://blog.sina.com.cn/s/blog_821ba53201010cqb.html
#include<string.h>
int
{
}
转自http://blog.sina.com.cn/s/blog_821ba53201010cqb.html