poj --3630 Phone List 字典树

思路: 使用trie..将电话号码s插入树中,如果发现s的前缀已存在或者是s是前面的号码的前缀,则输出"NO"..全部都成功插入则"YES"

这里的trie树要用数组表态实现,动态建树会TLE….

数组要开到100000这个数量级不然会RUNTIME ERROR

View Code
 1 //Accepted    4484K    172MS    C++    993B
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 #define M 10
 6 using namespace std;
 7 int ii;
 8 bool flag;
 9 struct Tree{
10     Tree* next[M];
11     int val;
12 };
13 
14 Tree node[100010];    
15 
16 Tree *root = &node[0];
17 
18 int tail;
19 
20 void insert(char ss[])
21 {
22     int len,i,j;
23     Tree* p;
24     len = strlen(ss);
25     p = root;
26     for(i=0;i<len;i++)
27     {
28         j = ss[i] - '0';    
29         if(p->next[j]==0)
30         {
31             p->next[j] = &node[tail];
32             tail++;
33         }
34         p = p->next[j];
35         if(p->val==1) flag = true;
36     }
37     p->val = 1;
38     for(i=0; i<10; i++)  
39         if(p->next[i])
40             flag = true;    
41 }
42 
43 int main(void)
44 {
45     int t,n;
46     char s[12];
47     for(scanf("%d",&t);t--;)
48     {
49         flag = false;
50         tail = 1;
51         for(scanf("%d",&n);n--;)
52         {
53             scanf("%s",s);
54             if(!flag)
55                 insert(s);
56         }
57         if(flag) printf("NO\n");
58         else printf("YES\n");
59     }
60     return 0;
61 }

 

 

转载于:https://www.cnblogs.com/asen32/archive/2012/08/22/2651503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值