UVA 1556 - Disk Tree(Trie)

UVA 1556 - Disk Tree

题目链接

题意:给定一些字符串,表示目录,要求输出整体目录的结构

思路:跟Trie树差不多,只不过是每个结点存放的是一个字符串,利用map映射即可

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <iostream>
using namespace std;

const int N = 40005;
int n;
char str[85];

struct Node {
    string name;
    map<string, int> vis;
} node[N];

int sz;

void insert(char *str) {
    int len = strlen(str);
    str[len] = '\\';
    int u = 0;
    for (int i = 0; i <= len; i++) {
	string tmp = "";
	while (str[i] != '\\') {
	    tmp += str[i];
	    i++;
	}
	if (!node[u].vis.count(tmp)) {
	    node[sz].vis.clear();
	    node[sz].name = tmp;
	    node[u].vis[tmp] = sz++;
	}
	u = node[u].vis[tmp];
    }
}

void init() {
    sz = 1;
    node[0].vis.clear();
    while (n--) {
	scanf("%s", str);
	insert(str);
    }
}

void print(int u, int d) {
    if (u) {
	for (int i = 0; i < d; i++)
	    printf(" ");
	cout << node[u].name << endl;
    }
    for (map<string, int>::iterator it = node[u].vis.begin(); it != node[u].vis.end(); it++) {
	print(it->second, d + 1);
    }
}

int main() {
    while (~scanf("%d", &n)) {
	init();
	print(0, -1);
	printf("\n");
    }
    return 0;
}

UVA 1556 - Disk Tree(Trie)

时间: 2024-10-11 19:50:27

UVA 1556 - Disk Tree(Trie)的相关文章

uva 1556 - Disk Tree(字典树)

题目连接:uva 1556 - Disk Tree 题目大意:给出N个目录关系,然后按照字典序输出整个文件目录. 解题思路:以每个目录名作为字符建立一个字典树即可,每个节点的关系可以用map优化. #include <cstdio> #include <cstring> #include <map> #include <string> #include <iostream> #include <algorithm> using nam

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 11732 &quot;strcmp()&quot; Anyone? (左儿子右兄弟前缀树Trie)

题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2832 字符串很多,又很长,如果按照题目的意思两两比较,肯定会TLE,所以要用前缀树(Trie)来解决,当然只是用简单的前缀树也会TLE的, 我们必须对其进行优化,看了

UVA 11732 strcmp() Anyone?(左儿子右兄弟Trie)

UVA 11732 strcmp() Anyone?(左儿子右兄弟Trie) ACM 题目地址: UVA 11732 strcmp() Anyone? 题意: 问strcmp函数的==语句执行了几次. 分析: 大白上的题目. 听说要用左儿子右兄弟的Trie,比较省空间,顺便学了下. 开始先建树记录次数,然后再遍历统计,结果错了... 后面参考了Shoutmon巨巨的写法,一边insert一边统计. 代码: /* * Author: illuz <iilluzen[at]gmail.com> *

UVA 11732 - strcmp() Anyone?(Trie)

UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比较,需要比较的总次数(注意,如果一个字符相同,实际上要还要和'\0'比一次,相当比2次) 思路:建Trie树,每次建树过程中,后继后继结点就是相同结点需要比较两次ans + val * 2,否则就是不同结点ans + val,建完树就计算完了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int

Disk Tree

Disk Tree Time limit: 2.0 secondMemory limit: 64 MB Hacker Bill has accidentally lost all the information from his workstation's hard drive and he has no backup copies of its contents. He does not regret for the loss of the files themselves, but for

UVA - 10534Wavio Sequence(LIS)

题目:UVA - 10534Wavio Sequence(LIS) 题目大意:给出N个数字,找出这样的序列:2 * n + 1个数字组成.前面的n + 1个数字单调递增,后面n + 1单调递减. 解题思路:从前往后找一遍LIS,再从后往前找一遍LIS.最后只要i这个位置的LIS的长度和LDS的长度取最小值.再*2 - 1就是这个波浪数字的长度.注意这里的求LIS要用nlog(n)的算法,而且这里的波浪数字的对称并不是要求i的LIS == LDS,而是只要求LIS和LDS最短的长度就行了,长的那个

UVALive 3942 - Remember the Word(DP,数组Trie+指针Trie)

UVALive 3942 - Remember the Word(DP,数组Trie+指针Trie) ACM 题目地址: UVALive 3942 - Remember the Word 题意: 给一些单词,然后给一个长的单词,问有几种方法能组成这个大单词,单词可以重复用. 分析: DP[i]=sum{DP[j} (i<j<len),从后往前求. 本来用数组Trie写得爽爽的,1A了. 发现2s多,不能忍! 然后用指针Trie写了一遍,各种出错,整个人都不好了... 研究了一遍别人代码,发现快

UVA 10951 - Polynomial GCD(数论)

UVA 10951 - Polynomial GCD 题目链接 题意:给定两个多项式,求多项式的gcd,要求首项次数为1,多项式中的运算都%n,并且n为素数. 思路:和gcd基本一样,只不过传入的是两个多项式,由于有%n这个条件,所以计算过程可以用乘法逆去计算除法模,然后最后输出的时候每项除掉首项的次数就是答案了. 代码: #include <stdio.h> #include <string.h> #include <vector> using namespace s