Poj1056

来源:互联网 发布:zabbix 网络拓扑 编辑:程序博客网 时间:2024/06/07 02:57
/**问题:合法的编码不允许出现一个编码是另一个的前缀。问题也就是怕段是否会出现这种情况。*解法:用字典树存储,定义两个标记,end,alr。end:为0代表打当前节点是一个编码的结束;当某一节点经过的节点end=1,代表表示end=1的节点是该节点的前缀。(end用于判断前面比自己短的编码)alr:为0,表示该节点未被其他编码经过,即没有前缀;为1,表示有其他编码经过,表示有前缀。(用于判断段编码是不是比自己长的前面编码的前缀)*/#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct {int next[2];int end,alr;}Tr;Tr t[1<<8];int num;int insert(char *x,int pos)//插入函数,并判断。{if(t[pos].end)//表示该节点是其长他节点的前缀。return 1;if(*x){t[pos].alr=1;//该节点被经过if(!t[pos].next[*x-'0'])t[pos].next[*x-'0']=num++;insert(x+1,t[pos].next[*x-'0']);}else{t[pos].end=1;return t[pos].alr;}}/*end of insert*/int main(){int flag=0;num=1;int u=0;char str[15];while(scanf("%s",str)!=EOF){if(str[0]=='9'){if(!flag){printf("Set %d is immediately decodable\n",++u);}else printf("Set %d is not immediately decodable\n",++u);flag=0;memset(t,0,sizeof(Tr)*(num+1));num=1;continue;}if(!flag&&insert(str,0))flag=1;}return 0;}/*The end*/


0 0
原创粉丝点击