• (字典树)Hihocoder


    原题链接: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 }
  • 相关阅读:
    Git 一些常用命令
    Opengl VS2008开发环境
    用 HTML5 给 iPad,iPhone 打造速度超快的应用_HTML5研究小组
    理解CSS3 transform中的Matrix(矩阵) « 张鑫旭鑫空间鑫生活
    Google Dremel 原理 如何能 3 秒分析 1PB 开源中国社区
    Perl:过滤注释
    HTML5 History API实现无刷新跳转 蓝飞技术部落格 —— 关注前沿,追求卓越。
    OPENGL编程指南
    Perl : Quantifier follows nothing in regex; marked by
    .js文件无法运行的方法
  • 原文地址:https://www.cnblogs.com/tak-fate/p/5903809.html
Copyright © 2020-2023  润新知