[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;
}

思维方式

有时候,顺其道而行未必快速,反向思考有利于简化代码。

posted @   robinyqc  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示