早教吧 育儿知识 作业答案 考试题库 百科 知识分享

C++ACM的密码截获问题密码截获TimeLimit:1000MSMemoryLimit:1024KDescription:Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如ABBA,ABA,A,123321等,但是他们有时会在开始或结束时

题目详情
C++ACM的密码截获问题
密码截获
Time Limit:1000MS Memory Limit:1024K
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
#include
#include
using namespace std;
int main()
{
for(string s;cin>>s;)
{
if(s.length()==1)
cout
▼优质解答
答案和解析
这道题首先通过循环遍历所有字符串,然后判断字符串是否对称,通过求得所有对称字符串的最大长度,得到答案.
代码如下:
#include
#include
char str[10000]; //存储用户输入的字符
// IsSymmetry函数 判断指定字符串s是否对称,对称则返回1,不对称则返回0,参数n为字符串长度
int IsSymmetry(char* s,int n)
{
int i,j;
for(i = 0,j = n - 1;i < j;i++,j--)
{
if(s[i] != s[j])
return 0;
}
return 1;
}
int main()
{
int i,j;
int max = 1;//存储最大长度,最小为1

while(gets(str))//获取用户输入的字符
{
int len = strlen(str);
max = 1;//最大长度初始化
for(i = 0;i < len;i++)//遍历所有字符串
{
for(j = len - i;j >=2;j--)
{
if(IsSymmetry(str + i,j))//当前字符串是对称的
{
if(j > max) //如果当前对称字符串的长度大于之前找到的最大长度,则更新max的值
{
max = j;
}
break; //由于字符串长度是递减的,所有一旦找到指定字母开头的最长的字符串,
//则可返回
}
}
}
printf("%d\n",max);
}
return 0;
}