#include<cstdio> #include<iostream> #include<string> #include<cstdlib> #define maxn 2 #include<queue> using namespace std; struct Tri { Tri*next[maxn]; int num; }; Tri *root; void buildTri(string ss)//建树的过程是一个动态的过程 动插的过程 { Tri *p=root,*q; for(int i=0;i<ss.size();i++) { int id=ss[i]-'0'; if(p->next[id]==NULL) { q=(Tri*)malloc(sizeof(Tri)); q->num=1; for(int j=0;j<maxn;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else p=p->next[id],p->num++; } p->num=-1;// 作为结束的标志 } int findTri(string ss) { Tri *p=root,*q; for(int i=0;i<ss.size();i++) { int id=ss[i]-'0'; p=p->next[id]; if(p==NULL) return 0; if(p->num==-1) return -1; } return -1; } void del(Tri *root) { Tri *zz=root; if(zz==NULL) return; for(int i=0;i<maxn;i++) { if(zz->next[i]!=NULL) del(zz->next[i]); } free(zz); } int main() { int Case=0; string ss; queue<string> fuck; while(cin>>ss) { if(ss=="9") { int flag=1; root=(Tri *)malloc(sizeof(Tri)); for(int i=0;i<maxn;i++) root->next[i]=NULL; root->num=1; while(!fuck.empty()) { string temp; temp=fuck.front(); fuck.pop(); if(findTri(temp)==-1) { flag=0; break; } buildTri(temp); } if(flag) printf("Set %d is immediately decodable ",++Case); else printf("Set %d is not immediately decodable ",++Case); del(root); continue; } fuck.push(ss); } return 0; }