http://acm.hdu.edu.cn/showproblem.php?pid=1305
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
struct Tire
{
int num;//记录改节点是否是输入字符串的最后一个字符,是赋值-1
Tire *next[2];
}Node;
Tire *head;//头结点
void Insert(string s)//插入字典树
{
Tire *T=head,*t;
int i,j;
for(i=0;i<s.size();i++)
{
int id=s[i]-'0';
if(T->next[id]==NULL)
{
t=new Tire;
for(j=0;j<2;j++)
{
t->next[j]=NULL;
t->num=0;
}
T->next[id]=t;
}
T=T->next[id];
}
T->num=-1;
}
bool Find(string s)//查找是否有相同前缀,有则返回false
{
Tire *T=head;
int count=0,i;
for(i=0;i<s.size();i++)
{
int id=s[i]-'0';
if(T->next[id]==NULL)
{
count=0;
break;
}
else
{
T=T->next[id];
count=T->num;
}
if(i<s.size()-1&&count==-1)return false;
}
return true;
}
int main()
{
char p[10][20];
int cnt=0,k,i;
while(scanf("%s",&p[0])!=EOF)
{
cnt++;
k=1;
head=new Tire;
for(i=0;i<2;i++)
{
head->next[i]=NULL;
head->num=0;
}
Insert(p[0]);
if(p[0][0]=='9')break;
while(scanf("%s",&p[k])!=EOF)
{
if(p[k][0]=='9')break;
Insert(p[k]);
k++;
}
for( i=0;i<k;i++)
{
int flag=Find(p[i]);
if(flag==false)
{
printf("Set %d is not immediately decodable\n",cnt);
break;
}
}
if(i>=k)
{
printf("Set %d is immediately decodable\n",cnt);
}
}
return 0;
}