zoukankan      html  css  js  c++  java
  • 密码截获

    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
    

    Source:

    Jin Qiwei
     
    后来才发现只要80长就够了,所以测试数据很弱,不用DP也行。
     
    /*
    #include<stdio.h>
    #include<string.h>
    #include<memory.h>
    #include<assert.h>
    #define MAX_LEN 80
    char szInput[MAX_LEN+1];
    unsigned char B[MAX_LEN+1][MAX_LEN];
    int length;
    int getcode()
    {
     int i,j,notfound1,notfound2=0;
     if(length<2)
      return 1;
     memset(B,0,(length+1)*MAX_LEN);
     for(i=0;i<2;++i)
     {
      for(j=0;j<length;++j)
       B[i][j]=1;
     }
     for(i=2;i<=length;++i)
     {
      for(notfound1=1,j=0;j<=length-i;++j)
      {
       if(B[i-2][j+1] && szInput[j]==szInput[j+i-1])
       {
        B[i][j]=1;
        //printf("%d,%d = 1\n",i,j);
        notfound1=0;
       }
      }
      if(notfound1)
      {
       if(notfound2)
        return i-2;
       notfound2=1;
      }
      else
      {
       notfound2=0;
      }
     }
     if(notfound2)
      return length-1;
     return length;
    }
    int main(void)
    {
     while(scanf("%s",szInput)!=EOF)
     {
      length=strlen(szInput);
      assert(length<=MAX_LEN);
      printf("%d\n",getcode());
     }
        return 0;
    }
    35 49172 rickone 0 184 902 GCC 2006-8-20 0:42:20
    */
    #include<stdio.h>
    #include<string.h>
    #include<memory.h>
    //#include<assert.h>
    #define MAX_LEN 80
    char szInput[MAX_LEN+1];
    unsigned char B[(MAX_LEN+1)*MAX_LEN/8];
    unsigned char Bit8[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
    #define GETB(i,j) (B[(i)*10+((j)>>3)] & Bit8[(j) & 0x7])
    #define SETB(i,j) B[(i)*10+((j)>>3)] |= Bit8[(j) & 0x7]
    int length;
    int getcode()
    {
     int i,j,notfound1,notfound2=0;
     if(length<2)
      return 1;
     memset(B,0,(length+1)*10);
     for(i=0;i<2;++i)
     {
      for(j=0;j<length;++j)
       SETB(i,j);//B[i][j]=1;
     }
     for(i=2;i<=length;++i)
     {
      for(notfound1=1,j=0;j<=length-i;++j)
      {
       if(GETB(i-2,j+1)/*B[i-2][j+1]*/ && szInput[j]==szInput[j+i-1])
       {
        SETB(i,j);//B[i][j]=1;
        //printf("%d,%d = 1\n",i,j);
        notfound1=0;
       }
      }
      if(notfound1)
      {
       if(notfound2)
        return i-2;
       notfound2=1;
      }
      else
      {
       notfound2=0;
      }
     }
     if(notfound2)
      return length-1;
     return length;
    }
    int main(void)
    {
     while(scanf("%s",szInput)!=EOF)
     {
      length=strlen(szInput);
      //assert(length<=MAX_LEN);
      printf("%d\n",getcode());
     }
        return 0;
    }
    /*35 49181 rickone 0 180 1122 GCC 2006-8-20 1:10:04*/
    以为改成用bit会Memory/8,呵呵
  • 相关阅读:
    pip遇见的format问题
    opencv配置
    WPF学习笔记2
    WPF笔记1 用VS2015创建WPF程序
    C#基础知识
    电脑中毒了。
    感觉又学到了不少,在这里写下来,但也有一个问题,不知道是为甚吗?
    通过对HTML有一定的了解后,现在我开始学HTML DOM了。
    此情可待成追忆,只是当时已惘然。
    常用PS快捷键
  • 原文地址:https://www.cnblogs.com/gredswsh/p/1827959.html
Copyright © 2011-2022 走看看