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