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;
    }
    
  • 相关阅读:
    Apache Flink教程
    开发EasyRTSPServer组件时如何使用ffserver搭建一套RTSP流媒体服务器并分发RTSP视频流?
    【解决方案】用科技的力量构筑“食品安全”防火墙,明厨亮灶保护“舌尖上的安全”
    RTSP/GB28181视频智能分析人脸识别系统EasyCVR除人脸门禁外还可以运用到哪些方向?
    GB28181/RTSP/SDK/Ehome协议安防视频融合平台EasyCVR新增分组管理功能操作介绍
    【解决方案】RTSP/GB28181协议视频平台EasyCVR在烟草行业是如何搭建一套网络视频监控系统的?
    【解决方案】RTSP/GB28181协议视频融合监控平台EasyCVR在三维可视化系统中的应用
    linux 学习随记---设置日志时间戳
    服务器端口总结
    (转载)PowerShell因为在此系统中禁止执行脚本解决方法
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13339605.html
Copyright © 2011-2022 走看看