本题是树形(森林)结构上的设计题:每个 span 至多有一个父节点;inherit=false 时开新根,形成多棵树并存。
维护:
parent / children:父子关系;order:进入顺序列表(仍存活的 span);latest:当前最新 span(即 order 末尾)。实现类 LogSystem,用森林维护若干 span(节点),并支持四类操作:
LogSystem():清空,当前无任何 span。enter(int spanId, bool inherit):加入唯一标识 spanId 的 span。若 inherit 为真且已有 span,则挂到当前最新 span 之下;否则无父。随后该 spanId 成为最新。log(string msg):若无 span,返回 msg;否则从最新 span 沿父指针走到根,按「根→最新」用 - 连接 id,再拼 ": " 与 msg(例:1-2-3: msg)。leave(int spanId):删除该 span 及其全部子孙;剩余 span 中最后进入者成为最新。保证 spanId 是最新或其祖先。按行给出函数调用序列:首行必为一次初始化,之后为若干次 enter / log / leave。调用总次数不超过 100。msg 长度满足 1≤∣msg∣<16;0≤spanId≤1000。
对每一次调用依次输出一行:构造与 enter/leave 输出 null;log 输出带引号的字符串结果。
输入:
LogSystem()
enter(10, false)
log("hi")
enter(20, true)
log("mid")
leave(10)
log("bye")
输出:
null
null
"10: hi"
null
"10-20: mid"
null
"bye"
说明:
enter(10,false) 后最新为 10;log("hi") 得 10: hi。enter(20,true) 使 20 成为 10 的子且最新为 20,故下一条日志为 10-20: mid。leave(10) 连同子孙 20 一并删空,最后一条日志只剩 bye。
输入:
LogSystem()
log("start")
enter(1, false)
enter(2, true)
enter(3, false)
enter(4, true)
log("a")
leave(3)
log("b")
leave(1)
log("c")
输出:
null
"start"
null
null
null
null
"3-4: a"
null
"1-2: b"
null
"c"
说明:
无 span 时 log("start") 原样返回。随后形成两棵树:1→2 与 3→4,最新为 4,故 a 对应 3-4: a。leave(3) 删掉第二棵树后最新回到 2,故 b 对应 1-2: b。再 leave(1) 清空,最后 c 无前缀。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.