#P2003. Hire and Fire
Hire and Fire
问题描述
在本问题中,你需要跟踪一个组织中不断变化的员工层级结构。组织的第一个事件是任命首席执行官(CEO)。随后,可能发生任意数量的雇佣和解雇操作。组织中的任何成员(包括CEO)都可以雇佣任意数量的直接下属,任何成员(包括CEO)都可能被解雇。组织的层级结构可以用一棵树来表示。请参考图1中的示例:
VonNeumann是该组织的CEO。VonNeumann有两个直接下属:Tanenbaum和Dijkstra。属于同一成员的直接下属根据其优先级(seniority)进行排序。在图中,这些成员的优先级从左到右递减。例如,Tanenbaum的优先级高于Dijkstra。
当某个成员雇佣一个新的直接下属时,新雇佣的下属的优先级低于该成员的所有其他直接下属。例如,如果图1中的VonNeumann雇佣Shannon,那么VonNeumann的直接下属将按优先级递减顺序排列为:Tanenbaum、Dijkstra和Shannon。
当组织中的某个成员被解雇时,有两种可能的情况:
如果被解雇者(即被解雇的人)没有下属,那么他/她将从组织的层级结构中直接移除。
如果被解雇者有下属,那么其优先级最高的直接下属将被晋升以填补该空缺。被晋升的人也将继承被解雇者的优先级。现在,如果被晋升的人也有下属,那么其优先级最高的直接下属也将被类似地晋升,这种晋升将沿着层级结构向下级联,直到某个没有下属的人被晋升。在图1中,如果Tanenbaum被解雇,那么Stallings将被晋升到Tanenbaum的位置和优先级,Knuth将被晋升到Stallings之前的位置和优先级。
图2显示了图1的层级结构在(1)VonNeumann雇佣Shannon和(2)Tanenbaum被解雇之后的结果:
输入
输入的第一行仅包含初始CEO的姓名。输入文件中的所有姓名由2到20个字符组成,这些字符可以是大小写字母、撇号和连字符(特别是没有空格)。每个姓名至少包含一个大写字母和至少一个小写字母。
第一行之后将跟随一行或多行附加行。每行的格式由以下三种语法规则之一决定:
[现有成员] hires [新成员]
fire [现有成员] print 在这里,[现有成员]是组织中已经是成员的任何个人的姓名,[新成员]是尚未成为组织成员的某个人的姓名。这三种类型的行(hires、fire和print)可以以任何顺序、任意次数出现。
你可以假设在任何时候组织中至少有一个成员(即CEO),且组织中的成员不超过1000人。
输出
对于每个print命令,打印当前组织的层级结构,假设自输入开始以来所有雇佣和解雇操作都已按上述说明处理。树形图(如图1和图2中的图)将根据以下规则转换为文本格式:
树形结构的文本表示中的每一行将恰好包含一个姓名。
第一行将包含CEO的姓名,从第1列开始。 整个树或任何子树,如果具有以下形式: 将以文本形式表示为:
输入中的每个print命令的输出结果将以一行由恰好60个连字符组成的行结束。输出中不会有任何空行。
输入数据 1
VonNeumann
VonNeumann hires Tanenbaum
VonNeumann hires Dijkstra
Tanenbaum hires Stallings
Tanenbaum hires Silberschatz
Stallings hires Knuth
Stallings hires Hamming
Stallings hires Huffman
print
VonNeumann hires Shannon
fire Tanenbaum
print
fire Silberschatz
fire VonNeumann
print
输出数据 1
VonNeumann
+Tanenbaum
++Stallings
+++Knuth
+++Hamming
+++Huffman
++Silberschatz
+Dijkstra
------------------------------------------------------------
VonNeumann
+Stallings
++Knuth
+++Hamming
+++Huffman
++Silberschatz
+Dijkstra
+Shannon
------------------------------------------------------------
Stallings
+Knuth
++Hamming
+++Huffman
+Dijkstra
+Shannon
------------------------------------------------------------
来源
Rocky Mountain 2004