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

  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完成这项工作。

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=='
') 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;
}
原文地址:https://www.cnblogs.com/wuwendongxi/p/13339605.html