[ABC273E] Notebook
题目的关键点是:给定 \(q\) 次操作,每次操作是以上四种操作,求每次操作后的当前列表的末尾最后一个数(若数组为空输出 -1)。
如果放在 trie 树里,不就是叶子节点吗?
默认根节点为 1,根节点的父亲节点是它自己。记录每个节点的父亲节点,以及自己存的值。当前列表的最后一位(终点)则用指针 now 记录。进行如下操作:
-
ADD:新增一个节点,将这个节点的父亲节点设为 *now,now 指向新增节点。 -
DELETE:now 指向 *now 的父亲。 -
SAVE: 用一个 hash_map (或者 map) 标记 x 对应的终点。也就是 map[x]=now。 -
LOAD:将 now 指向 标记的 x 对应的终点。
每次输出 (*now).fa 即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int>m;//即 hash_map
int tot=1,now=1;
struct trie{
int fa,data;
}t[5500005];
signed main(){
int q,x;string opt;
t[1].fa=1;
cin>>q;
while(q--){
cin>>opt;
if(opt!="DELETE")cin>>x;
if(opt=="ADD"){
t[++tot].fa=now;
t[tot].data=x;
now=tot;
}
else if(opt=="DELETE")now=t[now].fa;
else if(opt=="SAVE")m[x]=now;
else if(opt=="LOAD")now=m[x];
if(t[now].fa!=now)printf("%d ",t[now].data);
else printf("-1 ");
//对于无效的 m[x],返回值为 0。正好 t[0]=0,也解决了输出 -1 的问题。
}
return 0;
}
思维方式
有时候,顺其道而行未必快速,反向思考有利于简化代码。

浙公网安备 33010602011771号