uva 1556 - Disk Tree(字典树)

题目连接:uva 1556 - Disk Tree

题目大意:给出N个目录关系,然后按照字典序输出整个文件目录。

解题思路:以每个目录名作为字符建立一个字典树即可,每个节点的关系可以用map优化。

#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;
const int maxn = 50005;
typedef map<string, int>::iterator iter;

struct Tire {
    int sz;
    map<string, int> g[maxn];

    void init();
    void insert(string s);
    void put(int u, int d);
}tree;

int main () {
    int n;
    string s;
    while (cin >> n && n) {
        tree.init();
        for (int i = 0; i < n; i++) {
            cin >> s;
            s += ‘\\‘;
            tree.insert(s);
        }
        tree.put(0, 0);
        cout << endl;
    }
    return 0;
}

void Tire::init() {
    sz = 1;
    g[0].clear();
}

void Tire::insert(string s) {

    int u = 0;
    string word = "";

    for (int i = 0; i < s.length(); i++) {
        if (s[i] == ‘\\‘) {

            if (!g[u].count(word)) {
                g[sz].clear();
                g[u][word] = sz++;
            }

            u = g[u][word];
            word = "";
        } else
            word += s[i];
    }
}

void Tire::put (int u, int d) {

    for (iter i = g[u].begin(); i != g[u].end(); i++) {
        for (int j = 0; j < d; j++)
            cout << " ";
        cout << i->first << endl;
        put(i->second, d + 1);
    }
}
时间: 2024-12-25 18:18:59

uva 1556 - Disk Tree(字典树)的相关文章

UVA 1556 - Disk Tree(Trie)

UVA 1556 - Disk Tree 题目链接 题意:给定一些字符串,表示目录,要求输出整体目录的结构 思路:跟Trie树差不多,只不过是每个结点存放的是一个字符串,利用map映射即可 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <string> #include <map> #include &l

UVa 1556 Disk Tree

方法: Trie 其实就是建树,node里存文件名.因为最后同目录下的文件要按照文件名顺序输出,所以储存child pointer的时候用了map,自带排序.下面的code是动态分配内存,然而用数组也可以,参见trie template. Code: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <stri

uva 1385 - Billing Tables(字典树)

题目链接:uva 1385 - Billing Tables 题目大意:给定n个电话前缀,每个前缀是一个区域的前缀,现在要生成一个新的电话单,即对于每个电话号码,从旧的电话单上从前向后遍历,如果出现前缀匹配,则该电话号码对应的即为当前的区号,要求生成的新电话单尽量小. 解题思路:用dfs建立字典树,在区间范围内的点对应均为对应的区号,注意如果70.71.72....79都为SB的话,那么可以合并成7,并且对应区号为SB. 注意合并的条件为区号相同即可,并不是说对应旧电话单匹配位置相同. 注意这组

uva 11732 - strcmp() Anyone?(字典树)

题目链接:uva 11732 - strcmp() Anyone? 题目大意:给定n个串,然后两两之间比较,问说总共要比较多少次. 解题思路:字典树,建立出字典树,然后根据字典树的性质在节点记录有多少个字符串包含该节点.因为节点的个数比较多,所以用左孩子右兄弟的方法建立字典树. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long

UVA Phone List (字典树)(查询是否有前缀或自身是其他的前缀)

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

uva 1519 - Dictionary Size(字典树)

题目链接:uva 1519 - Dictionary Size 题目大意:给出n个字符串组成的字典,现在要添加新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词.问说能组成多少个单词. 解题思路:建立一棵前缀树和一棵后缀树,有多少节点即为有多少个前缀,扣除中间的部分即可加上长度为1的字符串即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

UVA 12333 大数,字典树

题意:给一个数字,看他最小是第几个菲波那切数列的前缀. 分析: 大数模板就是吊哦. 将菲波那切数列前500个数字放到字典树上.注意插入的时候不能像普通一样,只在尾节点处标记,而是一路标记下去. #include <bits/stdc++.h> using namespace std; const int NV = 10000; const int ra = 10; int ten[4] = {1,ra,ra*ra,ra*ra*ra}; int radix = ra*ra*ra*ra; stru

208. Implement Trie (Prefix Tree)字典树

Implement a trie with insert, search, and startsWith methods. Note: You may assume that all inputs are consist of lowercase letters a-z. 在Trie树中主要有3个操作,插入.查找和删除.一般情况下Trie树中很少存在删除单独某个结点的情况,因此只考虑删除整棵树. 1.插入 假设存在字符串str,Trie树的根结点为root.i=0,p=root. 1)取str[

ACM学习历程—HDU 5536 Chip Factory(xor &amp;&amp; 字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题目大意是给了一个序列,求(si+sj)^sk的最大值. 首先n有1000,暴力理论上是不行的. 此外题目中说大数据只有10组,小数据最多n只有100.(那么c*n^2的复杂度应该差不多) 于是可以考虑枚举i和j,然后匹配k. 于是可以先把所有s[k]全部存进一个字典树, 然后枚举s[i]和s[j],由于i.j.k互不相等,于是先从字典树里面删掉s[i]和s[j],然后对s[i]+s[j]这个