(字典树)Hihocoder - 1383 The Book List

原题链接:http://hihocoder.com/problemset/problem/1383t



题意:给定一些文件的绝对路径,然后把整个主目录按照树形结构输出。



分析:

字典树,用Map,从从字符串映射到下个节点,

注意:如果出现

a/b/c

a/b

这种应该输出:

a

  b

    c

  b

因为b既是文件又是目录,

妈的,在这里坑了三个小时

所有目录放在文件前面输出。

目录之间和文件之间分别按字典序排序。

最后递归输出。



代码:

  1 #include <set>
  2 #include <map>
  3 #include <list>
  4 #include <cmath>
  5 #include <queue>
  6 #include <vector>
  7 #include <bitset>
  8 #include <string>
  9 #include <cctype>
 10 #include <cstdio>
 11 #include <cstring>
 12 #include <cstdlib>
 13 #include <iostream>
 14 #include <algorithm>
 15
 16 using namespace std;
 17
 18 typedef long long ll;
 19 typedef unsigned long long ull;
 20 #define inf (0x3f3f3f3f)
 21 #define lnf (0x3f3f3f3f3f3f3f3f)
 22 #define eps (1e-8)
 23 int sgn(double a){return a < -eps ? -1 : a < eps ? 0 : 1;}
 24
 25 //--------------------------
 26
 27 string str;
 28
 29 struct Node{
 30     string name;
 31     bool exist;
 32     map<string,struct Node*> id;
 33     Node(string name){
 34         exist=false;
 35         name=name;
 36         id.clear();
 37     }
 38     Node(){
 39         id.clear();
 40         exist=false;
 41     };
 42     ~Node(){
 43         id.clear();
 44         name.clear();
 45     }
 46 };
 47
 48
 49 struct Node *root;
 50
 51 string space="    ";
 52
 53 void node_insert(string &s){
 54     struct Node *rt=root;
 55     string tmp;
 56     for(int i=0;i<s.length();i++){
 57         if(s[i]==‘/‘){
 58             if(!rt->id[tmp]){
 59                 rt->id[tmp]=new Node(tmp);
 60             }
 61             rt=rt->id[tmp];
 62             tmp.clear();
 63             continue;
 64         }
 65         tmp.push_back(s[i]);
 66     }
 67     if(!rt->id[tmp]){
 68         rt->id[tmp]=new Node(tmp);
 69     }
 70     rt=rt->id[tmp];
 71     rt->exist=true;
 72 }
 73
 74
 75
 76 bool cmp(map<string,struct Node*>::iterator a ,map<string,struct Node*>::iterator b){
 77     return (*a).first<(*b).first;
 78 }
 79
 80 void node_print(struct Node *rt,string k){
 81     if(rt->id.size()==0)return;
 82     vector<map<string,struct Node*>::iterator> vec1,vec2;
 83     for(map<string,struct Node*>::iterator it=rt->id.begin();it!=rt->id.end();it++){
 84         if((*it).second->exist)vec2.push_back(it);
 85         if((*it).second->id.size()>0)vec1.push_back(it);
 86     }
 87     sort(vec1.begin(),vec1.end(),cmp);
 88     sort(vec2.begin(),vec2.end(),cmp);
 89     for(vector<map<string,struct Node*>::iterator>::iterator it=vec1.begin();it!=vec1.end();it++){
 90         cout<<k<<(**it).first<<endl;
 91         node_print(rt->id[(**it).first],k+space);
 92     }
 93     for(vector<map<string,struct Node*>::iterator>::iterator it=vec2.begin();it!=vec2.end();it++){
 94         cout<<k<<(**it).first<<endl;
 95     }
 96 }
 97
 98 void rm(struct Node *rt){
 99     for(map<string,struct Node*>::iterator it=rt->id.begin();it!=rt->id.end();it++){
100         rm((*it).second);
101     }
102     delete rt;
103 }
104
105 void init(){
106     root=new Node();
107 }
108
109
110
111
112 void solve(){
113     init();
114     int t=0;
115     while(getline(cin,str)){
116         if(str=="0"){
117             cout<<"Case "<<++t<<":"<<endl;
118             node_print(root,"");
119             rm(root);
120             init();
121             continue;
122         }
123         node_insert(str);
124     }
125 }
126
127
128
129
130
131 int main() {
132
133 #ifndef ONLINE_JUDGE
134     freopen("in.txt", "r", stdin);
135     freopen("out.txt", "w", stdout);
136 #endif
137     iostream::sync_with_stdio(false);
138     solve();
139     return 0;
140 }
时间: 2024-10-26 11:39:24

(字典树)Hihocoder - 1383 The Book List的相关文章

hihoCoder 1014trie树(字典树)

hihoCoder 1014 题目提示已经很清楚了~ 贴代码…… #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 100000 + 10; const int alNum = 26; struct Node{ int cnt; int next[alNum]; void init(){ memset(next,-1,sizeof(

hihoCoder 1014 Trie树(字典树入门)

题目链接:http://hihocoder.com/problemset/problem/1014(此题附入门讲解) 题面: #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符

ACM学习历程—Hihocoder 1289 403 Forbidden(字典树 || (离线 &amp;&amp; 排序 &amp;&amp; 染色))

http://hihocoder.com/problemset/problem/1289 这题是这次微软笔试的第二题,过的人比第三题少一点,这题一眼看过去就是字符串匹配问题,应该可以使用字典树解决.不过当时还有一个想法就是离线处理,把所有查询进行排序,然后用rule去匹配查询,进行染色处理,而且每个查询只进行一次染色.事实证明,如果比赛的时候采用第二种方法应该能拿全分,但是我用了第一种方法,导致只拿了10分...因为我没有考虑同一个rule出现两次的情况,但是字典树中会直接被后面的rule覆盖,

字典树练习(一)hihocoder 1014(求相同前缀的数目)

题目链接: http://hihocoder.com/problemset/problem/1014 题意: 给定n个单词,然后我们构成一个字典树,然后再给你m个串,求有多少个单词是以这个串为前缀的. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100010;

逆序单词 HIhoCoder 1366 字典树

逆序单词 HIhoCoder 1366 字典序 题意 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词. 第1行:1个整数,N,表示单词数量.2≤N≤50,000. 第2..N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母.保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye). 输出第一行是个整数,表示单词表中的逆序单词的对数. 解题思路

hihoCoder 1014 Trie树(基础字典树)

题意  中文 最基础的字典树应用噢噢噢噢 #include<cstdio> #include<cstring> using namespace std; struct trie { trie *chi[26]; int num; trie() { num = 0; for(int i = 0; i < 26; ++i) chi[i] = NULL; } }*root; void insertTrie(char s[]) { trie *p = root; p->num+

hihoCoder 1383 : The Book List 北京网络赛

http://hihocoder.com/problemset/problem/1383?sid=950389 #1383 : The Book List 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The history of Peking University Library is as long as the history of Peking University. It was build in 1898. At the end of year 2015

简单的字典树(前缀树)

写这个树,主要是为了完成这道题目.http://hihocoder.com/problemset/problem/1014 代码如下,注释有比较详细的解释 1 #include <iostream> 2 #include <string> 3 #include <typeinfo> 4 #include <vector> 5 using namespace std; 6 7 /*****************************************

hdu 1251 统计难题(字典树)

Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output 对于每个提