http://acm.hdu.edu.cn/showproblem.php?pid=1305
判断是否有字符串是另一个字符串的前缀。
#include<cstdio>
#include<cstring>
#include<malloc.h>
typedef struct node
{
int count;
struct node *next[2];
}*tree;
void insert(tree h,char *s)
{
tree p=h;
int len=strlen(s),i;
for(i=0;i<len;i++)
{
int index=s[i]-'0';
if(p->next[index]!=NULL)
{
p=p->next[index];
p->count++;
}
else
{
tree tem=(tree)calloc(1,sizeof(node));
tem->count=1;
p->next[index]=tem;
p=tem;
}
}
}
int find(tree h,char *s)
{
tree p=h;
int len=strlen(s),i;
for(i=0;i<len;i++)
{
int index=s[i]-'0';
if(p->next[index]!=NULL)
p=p->next[index];
else return 0;
}
return p->count;
}
void delet(tree head)
{
int i;
for(i=0;i<2;i++)
{
if(head->next[i]!=NULL)
delet(head->next[i]);
}
free(head);
}
char s[1000][100];
int main()
{
int i,j=1,flag;
// freopen("a.txt","r",stdin);
while(scanf("%s",s[0])!=EOF)
{
tree head=(tree)calloc(1,sizeof(node));
insert(head,s[0]);
int n=1;
while(scanf("%s",s[n])!=EOF)
{
if(strcmp(s[n],"9")==0)break;
insert(head,s[n++]);
}
flag=0;
//for(i=0;i<n;i++)
// printf("%s\n",s[i]);
for(i=0;i<n;i++)
{
if(find(head,s[i])>1) {flag=1;break;}
//printf("%d\n",find(head,s[i]));
}
if(flag) printf("Set %d is not immediately decodable\n",j++);
else printf("Set %d is immediately decodable\n",j++);
delet(head);
}
return 0;
}