zoukankan      html  css  js  c++  java
  • 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<<'
    ';
     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<<'
    ';
     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<<'
    ';
     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<<'
    ';
    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

  • 相关阅读:
    研究SandHook
    MYSQL 事务与锁
    Java创造者詹姆斯·高斯林采访
    mybatis like 模糊查询
    【科普】彻底搞清楚什么是交换机什么是路由器。程序员基本功哦
    MinIO的简单使用实践
    如何将微信公众号的文章怎么保存转化为word文档?
    如何在recoil中主动刷新seloctor中缓存的值
    【译文】探索Recoil中的异步请求
    魅族云相册批量下载方案
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9759507.html
Copyright © 2011-2022 走看看