规则:
Catcher 是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
/*思路:
穷举,从第一个字符开始判定,然后字符串的个数逐次加一进行判定;
然后从第二个字符开始判定,字符个数也逐次加一进行判定;
*/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s,s1,s2;
int len;//字符串长度
while(cin>>s)
{
len=s.length();
int zong=0;//最长对称个数
for(int i=0;i<len;i++)//确定开头的字符的位置,从是位置0开始;
{
for(int j=1;j<=len;j++)//确定了开头的字符位置后,这里开始逐渐加长匹配的字符的长度
{
s1=s.substr(i,j);
s2=s.substr(i,j);
reverse(s2.begin(),s2.end());//输出s1的倒置形式,即对称部分
//&&左边条件:判定s2字符串是否可以在s1位置后面匹配到
//&&右边条件:判定s2的开头位置与s1的结尾位置之间的距离,等于0或者1都是对称的
if((s.find(s2,i+j)!=string::npos)&&(s.find(s2,i+j)-i-j<2))
{
//更新最长的个数
if(s.find(s2,i+j)+j-i>=zong) zong=s.find(s2,i+j)+j-i;
}
}
}
cout<<zong<<endl;
}
}