【NOIP2016模拟3】图书列表
Description
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认为这份列表很不容易阅读和查找,于是他决定按照以下规则制作一份新列表,用缩进来体现图书与目录之间的层级关系:
- n级目录之前有4×(n-1)个空格的缩进。
- 直接隶属于n级目录的图书前有4*n个空格的缩进。
- 直接隶属于目录X目录与图书按照字典序列在目录X之后,但所有目录位于所有图书之前。
- 所有一级目录按照字典序先后列出。
例如,上面的列表转化后将变为:
ART
HISTORY
CHINESE HISTORY
THREE KINDOM
RESEARCHES ON CAOCAO
RESEARCHES ON LIUBEI
CHINESE MORDEN HISTORY
JAPANESE HISTORY
JAPANESE ACIENT HISTORY
MATH
GRAPH THEORY
请写一个程序帮助小G完成这项工作。
Input
输入原列表,共包含不超过30本图书,以一个数字0结尾。
每行列出一个表项,表项是一个由大写字母、数字、“/”和空格构成的字符串,长度不超过100。
一本图书可能在列表中出现多次,但在转化后的列表中,它应该只出现一次。但是若同名的图书或目录若在不同的目录结构下,则认为他们是不相同的。换句话说,一个图书或目录由以它的名字为结尾的前缀唯一确定。
Output
输出新列表。本试题采用逐字节比较,行末请勿输出多余空格,文末以恰好一个换行符结尾。
Sample Input
B/A
B/A
B/B
0
Sample Output
B
A
B
Hint
【数据规模与约定】
对于20%的数据,只有一级目录。
对于另外20%的数据,没有同名的图书或目录。
对于另外20%的数据,每本图书仅出现一次。
对于100%的数据,参见输入格式中给出的数据范围,没有其它特殊约定。
思路
- 暴力
- 学习字符串相关函数
- 排序时想清楚优先级
- len表示图书深度(自己理解),注释部分为排序后的结果
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
struct fdfdfd{string c[105];int len;}a[35];
int n,maxlen,flag[35];
string keep[105];
bool cmp(fdfdfd x,fdfdfd y)
{
for(int i=1;i<=max(x.len,y.len)+1;++i)
{
//此处优先级
if(x.len!=y.len)//len前字符完全相同,len不同时图书在目录后
{
if(x.len<y.len&&x.len==i) return 0;
if(x.len>y.len&&y.len==i) return 1;
}
if(x.c[i].compare(y.c[i])>0) return 0;//比较len前字符串按字典序
if(x.c[i].compare(y.c[i])<0) return 1;
if(x.len==y.len) {if(x.len==i) return 1;}//len前字符完全相同,len相同时字典序
}
}
int main()
{
for(int i=1;;++i,++n)
{
char temp=getchar();
if(temp=='0') break;
a[i].c[1]+=temp; a[i].len=1;
for(int j=1;;)
{
temp=getchar();
if(temp=='\n') break;
if(temp=='/') ++a[i].len,++j,temp=getchar();
a[i].c[j]+=temp;
}
}
sort(a+1,a+n+1,cmp);
/* for(int i=1;i<=n;++i)
{
for(int j=1;j<=a[i].len;++j) cout<<a[i].c[j]<<' ';
cout<<endl;
}
cout<<"__________"<<endl;*/
for(int i=1;i<=n;++i)
{
int num=0,k=a[i].len+1;
for(int j=1;j<=a[i].len;++j,++num)
if(a[i].c[j]!=keep[j]){k=j; break;}
for(int j=k;j<=a[i].len;++j,++num)
{
keep[j]=a[i].c[j];
for(int p=1;p<=num;++p) cout<<" ";
cout<<a[i].c[j]<<endl;
}
}
return 0;
}