该程序出自某高人的blog,不知道具体算法是什么.望请那位大人帮忙解释下(好像是跟回文相关)

thunk123 2008-09-16 10:54:15
/*
该程序出自某高人的blog,不知道具体算法是什么.望请那位大人帮忙解释下(好像是跟回文相关)

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗? */


#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];//感觉跟Bit8有关系,但具体说不出来什么
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; //如果只输入两个字符,则返回1
memset(B,0,(length+1)*10);//MAX_LEN/8?
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;
}

...全文
103 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sincor 2008-09-17
  • 打赏
  • 举报
回复
我告非 倒了

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧