[ACM 1001] 密碼截獲
密碼截獲
Time Limit:1000MS Memory Limit:1024K
Description:
Catcher是MCA國的情報(bào)員,他工作時發(fā)現(xiàn)敵國會用一些對稱的密碼進(jìn)行通信,比如像這些ABBA,ABA,A,123321,但是他們有時會在開始或結(jié)束時加入一些無關(guān)的字符以防止別國破解。比如進(jìn)行下列變化ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因?yàn)榻孬@的串太長了,而且存在多種可能的情況(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量實(shí)在是太大了,他只能向電腦高手求助,你能幫Catcher找出最長的有效密碼串嗎?
Input:
測試數(shù)據(jù)有若干行字符串,包括字母,數(shù)字,符號。(字母區(qū)分大小寫)Output:
與輸入相對應(yīng)每一行輸出一個整數(shù),代表最長有效密碼串的長度。Sample Input:
ABBA 12ABBA A ABAKK 51233214 abaaab
Sample Output:
4 4 1 3 6 5

/**//*
** °ÝÃD´yz:http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1001
** Author: flysky
** date: 2008-01-19 ª¯§¾¤u§@°V½m¤é
*/
#include <iostream>
#include <string>
using namespace std;

int solve(string &input)

{
int len=input.size();
int passlen=1;
for(int i=0;i<len;i++)
{
int k=i;
int p2=0;
bool same=false;
for(int j=len-1;j>i;j--)
{
if(input[k]==input[j])
{
if(!same)
p2=j;
k++;
same=true;
}
else
{
same=false;
k=i;
}
}
if(passlen<p2-i+1) passlen=p2-i+1;
}
return passlen;
}
int main(int argc, char *argv[])

{
string input;
while(1)
{
cin>>input;
cout<<solve(input)<<endl;
}

return 0;
}
自己測試沒問題,提交卻不通過,感覺題目沒有說清楚如何退出。
----------------------------------------------------------------------------------------------
nana di~終於讓我過了
正確代碼:
#include <iostream>
#include <string>
using namespace std;

int solve(char *input,int len)

{
int passlen=1;
for(int i=0;i<len;i++)
{
int k=i;
int p2=0;
bool same=false;
for(int j=len-1;j>i;j--)
{
if(input[k]==input[j])
{
same=true;
p2=j;
for(int j1=j-1,i1=k+1;j1>i1;j1--,i1++)
if(input[i1]!=input[j1])
{
same=false;
break;
}
}
else
{
same=false;
k=i;
}
if(same)
{
if(passlen<p2-i+1) passlen=p2-i+1;
//i=p2+1;
break;
}
}
}
return passlen;
}
int main(int argc, char *argv[])

{
char input[100];
while(scanf("%s",input)!=EOF)
{
cout<<solve(input,strlen(input))<<endl;
}

return 0;
}posted on 2008-01-19 14:36 飛天 閱讀(1270) 評論(1) 編輯 收藏 引用 所屬分類: ACM

