zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13339605.html
Copyright © 2011-2022 走看看