[ACM 1001] 密码截获

[ACM 1001] 密码截获

密码截获
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
/**/ /*
** °ÝÃD´y­z: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;
}

你可能感兴趣的:([ACM 1001] 密码截获)