poj1056解题报告
//poj1056 immediate decodablity //AC of gcc #include <stdio.h> #include <string.h> #define SIZE 2000 #define MAX_BIT_NUM 20 #define MAX_LINES 20 //bool is not supported by GCC #define bool int #define true 1 #define false 0 typedef struct input_string { char data[MAX_BIT_NUM]; int length; }input_string; void insert_sort(input_string is[],int lines) { int i,j; input_string temp; for (i=1;i<lines;i++) { temp = is[i]; for (j=i-1;j>=0,temp.length<is[j].length;j--) is[j+1] = is[j]; is[j+1] = temp; } } int main() { bool is_decodable; int i,j,lines = 0,set_num = 0; char in_line[11]; bool flag[SIZE]; for (i=0;i<SIZE;i++) flag[i] = false; input_string is[MAX_LINES]; while(scanf("%s",in_line)!=EOF) { is_decodable = true; if (0==strcmp("9",in_line)) { set_num++; insert_sort(is,lines); for (i=0;i<lines && is_decodable;i++)//遍历组内各行数据 { int index_flag = 1;//编码对应的数组下标 for (j=0;j<is[i].length;j++)//计算本行编码对应的数组下标并判断是否符合前缀编码 { index_flag = (index_flag << 1)+(is[i].data[j]-'0'); if (flag[index_flag])//当前前缀index_flag已经被占用,无法形成前缀编码 { is_decodable = false; break; } } //检验本行是否通过前缀编码测试 if (is_decodable) { flag[index_flag] = true;//记录本行编码在flag数组中对应的位置 } } if (is_decodable)//本组所有行是否满足前缀编码规则 printf("Set %d is immediately decodable\n",set_num); else printf("Set %d is not immediately decodable\n",set_num); lines = 0; for (i=0;i<SIZE;i++) flag[i] = false; } else { strcpy(is[lines].data,in_line); is[lines].length = strlen(in_line); lines++; } } return 0; }