飛天

快乐的生活......

 

[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;
}

posted on 2008-01-19 14:36 飛天 阅读(1224) 评论(1)  编辑 收藏 引用 所属分类: ACM

评论

# re: [ACM 1001] 密码截获 2009-12-07 09:41 WonderCoder

你的得一个程序输入123ab321就知道错在哪里了。。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

Blogs

搜索

最新评论

阅读排行榜

评论排行榜