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