UVa 1556 - Disk Tree

來源:互聯網
上載者:User

標籤:

題目:給你一下檔案的路徑,對檔案的路徑按照字典序的輸出,如果有子目錄,下載父目錄的下面,

           前面加上和深度相同的空格。

分析:字典樹,字串。將路徑分解成多級的檔案夾和檔案,然後按字典序多級排序即可。

            這裡利用字典樹作為儲存的資料結構,便於查詢。

說明:注意去重。

#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;//Tiretypedef 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;}


UVa 1556 - Disk Tree

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.