POJ 3630

View Code
 1 /*
2 trie树:
3 利用trie树 查找单词 的简单程序
4 */
5 //法一:自己的方法
6 #include<iostream>
7 #include<cstdio>
8 using namespace std;
9
10 struct trie
11 {
12 bool is;//标记是否是个单词
13 trie *next[11];// 分别代表
14 void (*init)(trie *);// 为了初始化is=0,next=NULL
15 }node[100000];
16
17 trie *root;
18 bool f;
19 int k;
20
21 void teinit(trie *y)
22 {
23 int i;
24 (*y).is=0;
25 for(i=0;i<11;++i)
26 (*y).next[i]=NULL;
27 }
28
29 void insert(const char *word)
30 {
31 int i;
32 trie *p=root;
33 while(*word)
34 {
35 if(p->next[*word-'0']==NULL)
36 {
37 p->next[*word-'0']=&node[k++];
38 }
39 p=p->next[*word-'0'];
40 if(p->is)f=1;// 检测 别的号码 是这个号码的前缀 如:输入 1 12 型数据
41 word++;
42 }
43 for(i=0;i<11;++i)// 检测此 号码是别的号码的前缀 如:输入 12 1 型数据
44 if(p->next[i]!=NULL)f=1;
45 p->is=true;//单词遍历结束 标记一下说明到此处有个单词
46 }
47
48
49 int main()
50 {
51 char ch[80];
52 int i,n,t;
53 scanf("%d",&t);
54 while(t--)
55 {
56 for(i=0;i<100000;++i)
57 {
58 node[i].init=teinit;
59 node[i].init(&node[i]);
60 }
61 root=&node[0];
62 k=1;
63 f=0;
64 scanf("%d",&n);
65 for(i=0;i<n;++i)
66 {
67 scanf("%s",ch);
68 insert(ch);
69 }
70 if(f)printf("NO\n");
71 else printf("YES\n");
72 }
73 system("pause");
74 return 0;
75 }


法二:排序  +memset()

View Code
 1 /*
2 trie树:
3 利用trie树 查找单词 的简单程序
4 */
5 //法一:自己的方法
6 #include<iostream>
7 #include<cstdio>
8 #include<algorithm>
9 using namespace std;
10
11 struct trie
12 {
13 bool is;//标记是否是个单词
14 trie *next[10];// 分别代表
15 }node[100000];
16
17 struct node
18 {
19 int l;
20 char ch[11];
21 }str[10001];
22
23 trie *root;
24 bool f;
25 int k;
26
27 bool cmp(struct node x,struct node y)
28 {
29 return x.l<y.l;
30 }
31
32 void insert(const char *word)
33 {
34 int i;
35 trie *p=root;
36 while(*word)
37 {
38 if(p->next[*word-'0']==NULL)
39 {
40 p->next[*word-'0']=&node[k++];
41 memset(p->next[*word-'0'],0,sizeof(trie));
42 }
43 p=p->next[*word-'0'];
44 if(p->is)f=1;
45 word++;
46 }
47 p->is=true;
48 }
49
50
51 int main()
52 {
53 int i,n,t,len;
54 scanf("%d",&t);
55 while(t--)
56 {
57 root=&node[0];
58 memset(root,0,sizeof(trie));
59 k=1;
60 f=0;
61 scanf("%d",&n);
62 for(i=0;i<n;++i)
63 {
64 scanf("%s",str[i].ch);
65 len=strlen(str[i].ch);
66 str[i].l=len;
67 }
68 sort(str,str+n,cmp);
69 for(i=0;i<n;++i)
70 {
71 insert(str[i].ch);
72 }
73 if(f)printf("NO\n");
74 else printf("YES\n");
75 }
76 system("pause");
77 return 0;
78 }

 

posted @ 2012-02-11 20:21  知行执行  阅读(150)  评论(0编辑  收藏  举报