10.09T1

图书列表

【问题描述】

Peking University Library的历史和Peking University一样长,它始建于1898年。截止到2015年,它包含大约11000千册馆藏图书,其中8000千册为纸质图书,其余为电子图书。主席曾在1918~1919年间在该馆任职,他的工资是8大洋/月,当时顶尖教授的工资是280大洋/月。

现在小G在馆中担任与曾经任职过的相同的职位。他的第一份工作是重新安排一些图书。他得到了一张列表,每个表项具有以下格式:

CATEGORY1/CATEGORY 2/..../CATEGORY n/BOOKNAME

这表示图书BOOKNAME位于目录CATEGORY n下, 目录CATEGORY n 位于目录CATEGORY n-1下,目录CATEGORY n-1位于目录CATEGORY n-2下, 以此类推。也就是说,每个表项是由最后的一本图书,以及该图书所属的若干目录按照层级依次组成的。我们称CATEGORY1为一级目录,而CATEGORY 2为二级目录,以此类推。例如:

MATH/GRAPH THEORY

ART/HISTORY/JAPANESE HISTORY/JAPANESE ACIENT HISTORY

ART/HISTORY/CHINESE HISTORY/THREE KINDOM/RESEARCHES ON LIUBEI

ART/HISTORY/CHINESE HISTORY/CHINESE MORDEN HISTORY

ART/HISTORY/CHINESE HISTORY/THREE KINDOM/RESEARCHES ON CAOCAO

小G认为这份列表很不容易阅读和查找,于是他决定按照以下规则制作一份新列表,用缩进来体现图书与目录之间的层级关系:

1) n级目录之前有4×(n-1)个空格的缩进。

2) 直接隶属于n级目录的图书前有4*n个空格的缩进。

3) 直接隶属于目录X目录与图书按照字典序列在目录X之后,但所有目录位于所有图书之前。

4) 所有一级目录按照字典序先后列出。

例如,上面的列表转化后将变为:

ART

    HISTORY

        CHINESE HISTORY

            THREE KINDOM

                RESEARCHES ON CAOCAO

                RESEARCHES ON LIUBEI

            CHINESE MORDEN HISTORY

        JAPANESE HISTORY

            JAPANESE ACIENT HISTORY

MATH

    GRAPH THEORY

请写一个程序帮助小G完成这项工作。

【输入格式】

       输入原列表,共包含不超过30本图书,以一个数字0结尾。

       每行列出一个表项,表项是一个由大写字母、数字、“/”和空格构成的字符串,长度不超过100。

一本图书可能在列表中出现多次,但在转化后的列表中,它应该只出现一次。但是若同名的图书或目录若在不同的目录结构下,则认为他们是不相同的。换句话说,一个图书或目录由以它的名字为结尾的前缀唯一确定。

【输出格式】

输出新列表。本试题采用逐字节比较,行末请勿输出多余空格,文末以恰好一个换行符结尾。

样例输入1

样例输出1

B/A

B/A

B/B

0

B

    A

    B

样例输入2

样例输出2

A1/B1/B32/B7

A1/B/B2/B4/C5

A1/B1/B2/B6/C5

A1/B1/B2/B5

A1/B1/B2

A1/B1/B2/B1

A1/B3/B2

A3/B1

A0/A1

0

A0

    A1

A1

    B

        B2

            B4

                C5

    B1

        B2

            B6

                C5

            B1

            B5

        B32

            B7

        B2

    B3

        B2

A3

    B1

【数据规模与约定】

对于20%的数据,只有一级目录。

对于另外20%的数据,没有同名的图书或目录。

对于另外20%的数据,每本图书仅出现一次。

对于100%的数据,参见输入格式中给出的数据范围,没有其它特殊约定。

暴力模拟,但数据非常水

code:

  1 /*
  2     Name:booklist
  3     Copyright:BashuOJ
  4     Author: ZYH
  5     Date: 09/10/18 09:06
  6     Description: imitate
  7 */
  8 #include<algorithm>
  9 #include<iostream>
 10 #include<cstdio>
 11 #include<map>
 12 #include<string>
 13 #define N 1005
 14 using namespace std;
 15 struct point {
 16     int id,father;
 17     int ch[1000],size;
 18     string name;
 19     int special;
 20 } p[N];
 21 int find(int id,string k) {
 22     for(int i=1; i<=p[id].size; i++) {
 23         if(p[p[id].ch[i]].name==k)return p[id].ch[i];
 24     }
 25     return -1;
 26 }
 27 int tot=-1;
 28 int newnode(string k) {
 29     p[tot+1].id=tot+1;
 30     tot++;
 31     p[tot].size=0;
 32     p[tot].name=k;
 33     return tot;
 34 }
 35 struct node {
 36     int id;
 37     string name;
 38 };
 39 bool cmp(node a,node b) {
 40     if(p[a.id].size!=0&&p[b.id].size==0)return 1;
 41     if(p[a.id].size==0&&p[b.id].size)return 0;
 42     for(int i=0; i<min(a.name.size(),b.name.size()); i++) {
 43         if(a.name[i]<b.name[i])return 1;
 44         else if(a.name[i]>b.name[i])return 0;
 45     }
 46     if(a.name.size()<b.name.size())return 1;
 47     return 0;
 48 }
 49 void bfs(int now,int dep,int pos) {
 50     node a[1000];
 51     if(now) {
 52         for(int i=1; i<=dep-1; i++)cout<<"    ";
 53         cout<<p[now].name;
 54         if(pos==p[p[now].father].size&&p[p[now].father].special&&p[now].size)p[now].special=1;
 55         if(pos==p[p[now].father].size&&p[p[now].father].special&&!p[now].size)return;
 56         cout<<'\n';
 57     }
 58     for(int i=1; i<=p[now].size; i++) {
 59         a[i].id=p[now].ch[i];
 60         a[i].name=p[p[now].ch[i]].name;
 61     }
 62     sort(a+1,a+p[now].size+1,cmp);
 63     for(int i=1; i<=p[now].size; i++) {
 64         bfs(a[i].id,dep+1,i);
 65     }
 66 }
 67 string used[1000];
 68 int all=0;
 69 int main() {
 70     freopen("booklist.in","r",stdin);
 71     freopen("booklist.out","w",stdout);
 72     string k;
 73     newnode("");
 74     while(getline(cin,k)&&k!="0") {
 75         used[++all]=k;
 76         int level=0;
 77         string temp="";
 78         int now=0;
 79         for(int i=0; i<k.size(); i++) {
 80             if(k[i]!='/') {
 81                 temp=temp+k[i];
 82                 //    cout<<"now->"<<k[i]<<"  temp->"<<temp<<endl;
 83             }
 84             if(k[i]=='/'||i==k.size()-1) {
 85                 int judge=find(now,temp);
 86                 //    cout<<"Judge->"<<judge;
 87                 if(judge!=-1) { //如果找到有这一本书
 88             //        cout<<"temp->"<<temp<<"  id->"<<judge<<'\n';
 89                     int flag=0;
 90                     for(int j=1;j<all;j++)if(used[j]==k)flag=1;
 91                     if(i==k.size()-1&&!flag) {
 92                         int id=newnode(temp);
 93             //            cout<<"temp->"<<temp<<"  id->"<<id<<'\n';
 94                         p[now].ch[++p[now].size]=id;
 95                         p[id].father=now;
 96                         now=id;
 97                     } else now=judge;
 98                     temp="";
 99                 } else {
100                     int id=newnode(temp);
101             //        cout<<"temp->"<<temp<<"  id->"<<id<<'\n';
102                     p[now].ch[++p[now].size]=id;
103                     p[id].father=now;
104                     now=id;
105                     temp="";
106                 }
107             }
108         }
109     }
110     p[0].special=1;
111     bfs(0,0,p[0].size);
112     return 0;
113 }

over

猜你喜欢

转载自www.cnblogs.com/saionjisekai/p/9759507.html