问题描述:Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
知识点: 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
题目来源: 内部整理
练习阶段: 中级
运行时间限制: 10Sec
内存限制: 128MByte
输入:
输入一个字符串
输出:
返回有效密码串的最大长度
样例输入: ABBA
知识点: 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
题目来源: 内部整理
练习阶段: 中级
运行时间限制: 10Sec
内存限制: 128MByte
输入:
输入一个字符串
输出:
返回有效密码串的最大长度
样例输入: ABBA
样例输出: 4
没啥好说的,对称的字符分奇偶数讨论就可以了,例如ABA,ABBA两种情况。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
getline(cin,s);
int len,maxnum=0;
len=s.size();
if(len<=1)
maxnum=len;
for(int i=1;i<len-1;i++)
{
if(s[i]==s[i+1])//ABBA情况
{
int j=i,k=i+1,cnt=0;
while(j>=0&&j<len&&k>=0&&k<len)
{
if(s[j]==s[k])
{
j--;
k++;
cnt=cnt+2;
}
else
break;
}
if(cnt>maxnum)
maxnum=cnt;
}
if(s[i-1]==s[i+1])//ABA情况
{
int j=i-1,k=i+1,cnt=1;
while(j>=0&&j<len&&k>=0&&k<len)
{
if(s[j]==s[k])
{
j--;
k++;
cnt=cnt+2;
}
else
break;
}
if(cnt>maxnum)
maxnum=cnt;
}
}
cout<<maxnum<<endl;
//system("pause");
return 0;
}