// 题意: 输入一组01串,判断是否存在某个数是另外一个数的前缀。
#include <iostream> // trie树
using namespace std ;
struct Node
{
int next[2];
int vis; //记录该节点所代表的号码是否出现过
}table[100];
int cur;
void init()
{
memset(table[0].next,-1,sizeof(table[0].next));
cur=1;
}
int prefix(char ch[]) //若出现前缀情况则返回 1
{
Node* p=&table[0]; //table[0]作为根节点
int tag=1; //假定存在前缀
for(int i=0;ch[i];++i)
{
int j=ch[i]-'0';
if(p->next[j]==-1) //说明不可能存在前缀
{
tag=0;
p->next[j]=cur++;
Node* q=&table[p->next[j]];
for(int k=0;k<10;++k)
q->next[k]=-1;
q->vis=0; //该节点所代表的号码一定还没出现过
}
p=&table[p->next[j]]; //继续搜索下去
if(p->vis) //说明存在前缀
return 1;
}
p->vis=1;
return tag;
}
int main()
{
int cases=1;
char ch[12];
while(scanf("%s",ch)!=EOF)
{
init();
prefix(ch);
int suc=1;
while(scanf("%s",ch)&&ch[0]!='9')
{
if(suc&&prefix(ch))
suc=0;
}
if(suc)
printf("Set %d is immediately decodable\n",cases++);
else
printf("Set %d is not immediately decodable\n",cases++);
}
return 0 ;
}