【题解】密码截获
【题目描述】
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况 (abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的 有效密码串吗?
【输入描述】
测试数据有若干行字符串,包括字母,数字,符号。(字母区分大小写)
【输出描述】
与输入相对应每一行输出一个整数,代表最长有效密码串的长度。
【样例输入】
ABBA 12ABBA A ABAKK 51233214 abaaab
【样例输出】
4 4 1 3 6 5
【题目分析】
对称密码进行通信,就是这段代码中有回文,可以单独写个函数判断。
只判断有没有回文还不行,题目中要求求“有效密码串”的最长长度。
题目没有确定多少组,输入“不确定长度输入”类型。
【参考代码】
#include <iostream> #include <cstring> #include <cstdio> using namespace std; //判断回文函数 ,返回的是回文串的长度 int HuiWen(char *s,int i,int j){ int low=i,high=j; while(low!=high && s[low]==s[high]){ low++; high--; } if(low>=high) return j-i+1; else return 0; } int main(){ char str[10001]; //字符数组 // cin>>str; // cout<<HuiWen(str,0,5); while(cin>>str){ //不确定长度 int max=0; //初始化 int k,len=strlen(str); //定义临时比较值和长度 for(int i=0;i<len;i++){ for(int j=i+1;j<len;j++){ //双重for循环,暴力枚举 if(k=HuiWen(str,i,j)) //如果是回文 ,返回长度 if(k>max) max=k; //找最大值的过程 } } if(len==1) //单独处理特殊情况,否则max会为0 max=1; cout<<max<<endl; } return 0; } /* ABBA 12ABBA A ABAKK 51233214 abaaab */
(adsbygoogle = window.adsbygoogle || []).push({});