标签:
题目:给你一下文件的路径,对文件的路径按照字典序的输出,如果有子目录,下载父目录的下面,
前面加上和深度相同的空格。
分析:字典树,字符串。将路径分解成多级的文件夹和文件,然后按字典序多级排序即可。
这里利用字典树作为存储的数据结构,便于查询。
说明:注意去重。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const int dictsize = 128; const int nodesize = 20002; const int wordsize = 20002; //Tire typedef struct _tnode { int flag; _tnode *next[dictsize]; }tnode; tnode dict[nodesize]; char list[wordsize][10]; class Tire { private: int size; int count; tnode* root; public: Tire() {initial();} void initial() { memset(dict, 0, sizeof(dict)); size = count = 0; root = newnode(); } tnode* newnode() {return &dict[size ++];} int insert(char* word) { tnode* now = root; for (int i = 0 ; word[i] ; ++ i) { if (!now->next[word[i]]) now->next[word[i]] = newnode(); now = now->next[word[i]]; } if (!now->flag) { now->flag = ++ count; strcpy(list[count], word); } return now->flag; } }; // typedef struct _dnode { int id[40]; }dnode; dnode line[wordsize]; char buf[88],temp[10]; bool cmp(dnode a, dnode b) { for (int i = 0;; ++ i) { if (a.id[i] == -1) return 1; if (b.id[i] == -1) return 0; int value = strcmp(list[a.id[i]], list[b.id[i]]); if (value) return value < 0; } return 0; } int main() { int t,n,start,count,sum,first = 1; scanf("%d",&t); while (t --) { scanf("%d",&n); Tire tire; memset(line, 0, sizeof(line)); sum = 0; for (int i = 0; i < n; ++ i) { scanf("%s",buf); start = count = 0; for (int j = 0; buf[j]; ++ j) { if (buf[j] == '\\') { line[sum].id[count] = tire.insert(temp); line[sum].id[++ count] = -1; start = j+1; for (int k = 0; k < count; ++ k) line[sum+1].id[k] = line[sum].id[k]; ++ sum; }else { temp[j-start] = buf[j]; temp[j-start+1] = 0; } } line[sum].id[count] = tire.insert(temp); line[sum].id[++ count] = -1; ++ sum; } sort(line, line+sum, cmp); count = -1,start = -1; for (int i = 0; i < sum; ++ i) { for (int j = 0; line[i].id[j] != -1; ++ j) { if (line[i].id[j+1] == -1) { if (j == count && start == line[i].id[j]) break; for (int k = 0; k < j; ++ k) printf(" "); printf("%s\n",list[line[i].id[j]]); start = line[i].id[j]; count = j; break; } } } if (t) printf("\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/mobius_strip/article/details/45457013