POJ_3630 Phone List 字典树

比较惊险的一次字典树

继上次动态分配内存字典树,这次尝试使用静态数组存放字典树:每个trie[i][j]保存其子树的节点序号,使用全局变量更新,权值以及其余值则另外存储

题意:判断给出的几个数字串中是否有一个是另一个的前缀

使用字典树比较时需要处理 123 123, 123 123456, 123 12,1230 1234等情况,细节较多,不过还是可以通过添加辅助数组以及标志变量处理的。

注:process描述可能有点差错,只供参考(反正我当时是看着写的)

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <set>
 6 #include <queue>
 7 using namespace std;
 8 #define maxnode 12
 9 #define maxn 10005
10 
11 /*
12 process:
13     string s;
14     flag
15     along the tree
16     s[i] already exist?
17         i == s_size? return 0;
18         else go to it's sub tree
19     No s[i] ?
20         i != 0?
21             flag & no hasChild? return 0;
22             create node, refresh flag
23         i == 0?
24             create node, refresh flag
25 */
26 int trie[maxn * 10][maxnode];//0 as root
27 bool hasChild[maxn * 10];
28 int totindex = 1;
29 char st[maxn][15];
30 
31 void init(){
32     memset(trie, 0, sizeof(trie));
33     memset(st, 0, sizeof(st));
34     memset(hasChild, 0, sizeof(hasChild));
35     totindex = 1;
36 }
37 
38 int insert_find(char tms[]){
39     bool flag = true;
40     int len = strlen(tms), i = 0, j = 0;
41     for(; i < len; i++){
42         if(trie[j][tms[i] - '0']){
43             if(i == len - 1)
44                 return 0;
45             j = trie[j][tms[i] - '0'];
46         }
47         else{
48             if(i != 0){
49                 if(flag && !hasChild[j]){
50                     return 0;
51                 }
52                 else{
53                     hasChild[j] = true;
54                     flag = false;
55                     trie[j][tms[i] - '0'] = totindex++;
56                     j = trie[j][tms[i] - '0'];
57                 }
58             }
59             else{
60                 hasChild[j] = true;
61                 flag = false;
62                 trie[j][tms[i] - '0'] = totindex++;
63                 j = trie[j][tms[i] - '0'];
64             }
65         }
66     }
67     return 1;
68 }
69 
70 int main(){
71     int t;
72     scanf("%d", &t);
73     while(t--){
74         int n;
75         init();
76         memset(st, 0, sizeof st);
77         scanf("%d", &n);
78         for(int i = 0; i < n; i++){
79             scanf("%s", st[i]);
80         }
81 
82         bool flag = true;
83         for(int i = 0; i < n; i++){
84             int tmp = insert_find(st[i]);
85             if(!tmp){
86                 flag = false;
87                 break;
88             }
89         }
90 
91         if(flag){
92             printf("YES\n");
93         }
94         else{
95             printf("NO\n");
96         }
97     }
98 }

题目:

Phone List
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 29377   Accepted: 8764

Description

Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers:

  • Emergency 911
  • Alice 97 625 999
  • Bob 91 12 54 26

In this case, it's not possible to call Bob, because the central would direct your call to the emergency line as soon as you had dialled the first three digits of Bob's phone number. So this list would not be consistent.

Input

The first line of input gives a single integer, 1 ≤ t ≤ 40, the number of test cases. Each test case starts with n, the number of phone numbers, on a separate line, 1 ≤ n ≤ 10000. Then follows n lines with one unique phone number on each line. A phone number is a sequence of at most ten digits.

Output

For each test case, output "YES" if the list is consistent, or "NO" otherwise.

Sample Input

2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

Sample Output

NO
YES
posted @ 2017-05-02 20:43  EricJeffrey  阅读(114)  评论(0编辑  收藏  举报