HDU1671-Phone List (trie树)

---恢复内容开始---

     trie树,我是设置了号码结束标志,在insert函数里做处理:如果在插入的过程中,一直没有开辟新的节点,说明新插入的这个号码是某个已经插入了的号码的前缀,输出“NO”。如果在插入的过程中,经过了结束标志,说明这个新插入的号码之前已经插入了前缀号码,同样的,输出“NO”。此外,都输出“YES”。

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #include<string.h>
 4 typedef struct tnode
 5 {
 6     int mark;
 7     tnode *next[10];
 8 }tnode;
 9 tnode *root;
10 void init()
11 {
12     int i;
13     root=(tnode*)malloc(sizeof(tnode));
14     for(i=0;i<10;i++)
15         root->next[i]=NULL;
16   root->mark=0;
17 
18 }
19 int  insert(char *str)
20 {
21     tnode *r=root,*child;
22     int i,flag=0;
23     while(*str!='\0')
24     {
25         if(r->next[*str-'0']==NULL)
26         {   flag=1;
27             child=(tnode*)malloc(sizeof(tnode));
28             for(i=0;i<10;i++)
29                 child->next[i]=NULL;
30             child->mark=0;
31             r->next[*str-'0']=child;
32 
33 
34         }
35         if(r->next[*str-'0']->mark==1){flag=0;break;}
36         r=r->next[*str-'0'];
37         str++;
38 
39     }
40     r->mark=1;
41     if(!flag) return 1;
42     else return 0;
43 }
44 void del(tnode *r)
45 {
46     for(int i=0;i<10;i++)
47     {
48         if(r->next[i]!=NULL)
49         del(r->next[i]);
50     }
51     free(r);
52 }
53 
54 int search(char *str)
55 {
56     tnode *r=root;
57     int i=0,len,j;
58     len=strlen(str);
59     for(j=0;j<len-1;j++)
60     {
61         r=r->next[str[i]-'0'];
62     }
63     for(i=0;i<10;i++)
64         if(r->next[i]!=NULL)
65             return 1;
66         return 0;
67 }
68 int main()
69 {
70     int T,n,i,flag,mark;
71     char num[10005][20],ch;
72     scanf("%d",&T);
73     while(T--)
74     {
75         scanf("%d",&n);
76         ch=getchar();
77         init();
78         gets(num[0]);
79         flag=insert(num[0]);
80         mark=0;
81         for(i=1;i<n;i++)
82         {
83             gets(num[i]);
84             flag=insert(num[i]);
85             if(flag)mark=1;;
86         }
87     
88         
89    if(mark)printf("NO\n");
90 
91     else printf("YES\n");
92         del(root);
93 
94     }
95 
96     return 0;
97 }

 

---恢复内容结束---

posted @ 2013-04-17 21:23  Yuki_i  阅读(163)  评论(0编辑  收藏  举报