POJ 3630 Trie

链接:

http://poj.org/problem?id=3630

题意:

给你n个字符串,判断有没有字符串是其他字符串的前缀

题解:

建一个字典树,在插入的过程中,如果没有新建一个结点,那这个字符串肯定是其他字符串的前缀,

如果新建结点的时候发现,有的字符串以这个字符结尾,那肯定有字符串是这个字符串的前缀

代码:

31 int pi = 1;
32 int fg;
33
34 struct Node {
35     int next[10];
36     bool end;
37 }tree[MAXN];
38
39 void insert(string keyword) {
40     int index, p, i;
41     int flag = 0;
42     for (i = p = 0; keyword[i]; i++) {
43         index = keyword[i] - ‘0‘;
44         if (tree[p].next[index] == 0) {
45             tree[p].next[index] = pi++;
46             flag = 1;
47             if (tree[p].end) fg = 0;
48         }
49         p = tree[p].next[index];
50     }
51     if (!flag) fg = 0;
52     tree[p].end = 1;
53 }
54
55 int main() {
56     int T;
57     cin >> T;
58     while (T--) {
59         pi = 1;
60         fg = 1;
61         memset(tree, 0, sizeof(tree));
62         int n;
63         cin >> n;
64         while (n--) {
65             string s;
66             cin >> s;
67             insert(s);
68         }
69         if (fg) cout << "YES" << endl;
70         else cout << "NO" << endl;
71     }
72     return 0;
73 }
时间: 2024-10-24 13:56:33

POJ 3630 Trie的相关文章

POJ - 3630 代码

Trie的简单应用,只涉及插入字符串的操作. 需要注意的是,输入数据有T组,在处理每一组数据之前都要初始化root,由于忽视了这一点WA了n次. 还有一点就是,在发现一组数据答案为“NO”之后,仍然要读完这组数据的字符串.在这一点上也WA了好多次= = 另外,本题大概需要建立4000000个节点,如果采用动态空间建点会TLE. 看来malloc操作确实是很慢啊. 所以提前开一个大的数组空间,静态的就好了. 代码如下: /* Author : Magician Van */ #include <i

poj 3630 Phone List (字典树 +静态字典树)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22235   Accepted: 6885 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 catalogu

poj 1056 Trie树判断哈夫曼编码是否合法

理解了Trie树然后就能1A   其实估计这个题随便做做就能A掉,可能不需要高级数据. 先贴吉林大学的代码模板 /*==================================================*| Trie树(k叉) | INIT: init(); | 注: tree[i][tk]>0时表示单词存在, 当然也可赋予它更多含义; \*==================================================*/ const int tk = 26,

POJ 3630 Phone List(trie树的简单应用)

题目链接:http://poj.org/problem?id=3630 题意:给你多个字符串,如果其中任意两个字符串满足一个是另一个的前缀,那么输出NO,否则输出YES 思路:简单的trie树应用,插入的过程中维护到当前节点是不是字符串这个布尔量即可,同时判断是否存在上述情况. code: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <cstring> 5

POJ 3630 Phone List Trie题解

Trie的应用题目. 本题有两个难点了: 1 动态建立Trie会超时,须要静态建立数组,然后构造树 2 推断的时候注意两种情况: 1) Tire树有133,然后插入13333556的时候.2)插入顺序倒转过来的时候 改动一下标准Trie数的插入函数就能够了: #include <stdio.h> #include <string.h> const int MAX_NODE = 100001; const int MAX_WORD = 11; const int ARR_SIZE =

poj 3630 / hdu 1671 Phone List 【Trie字典树 动态创建&amp;静态创建】

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25160   Accepted: 7641 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 catalogu

poj 3630 Phone List trie

题意:判断是否有某字符串是别的字符串的前缀.是则输出NO,不然输出YES. 思路:把板子写成结构体版的..详见代码: /********************************************************* file name: poj3630.cpp author : kereo create time: 2015年02月09日 星期一 22时22分45秒 *******************************************************

poj 3630 Phone List trie树

Phone List 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,

poj 3630 Phone List(字典树)

题目链接: http://poj.org/problem?id=3630 思路分析: 求在字符串中是否存在某个字符串为另一字符串的前缀: 即对于某个字符串而言,其是否为某个字符串的前缀,或存在某个其先前的字符串为其前缀: (1)若该字符串为某个字符串前缀,则存在一条从根节点到该字符串的最后一个字符串的路径; (2)若存在某个字符串为该字符串前缀,则在该字符串的查找路径中存在一条子路径,路径的最后的结点的endOfWord 标记为true,表示存在某个字符串为其前缀: 代码: #include <