UVA 12219 Common Subexpression Elimination

VS2022命令行编译C++报错?一招解决‘fatal error C1034: iostream: 不包括路径集‘ 本文针对VS2022命令行编译C++时常见的'fatal error C1034: iostream: 不包括路径集'错误,深入剖析了其根源在于环境变量缺失。文章提供了永久配置用户环境变量(PATH、INCLUDE、LIB)的一劳永逸解决方案,确保在任何终端中都能直接使用cl命令进行编译,并给出了进阶配置与常见错误排查指南。 阅读详情

UVA 12219 Common Subexpression Elimination

解题的第一步显然是构建表达式树,因为题目保证运算符均为二元的,所以该表达式树是一颗二叉树,本题要求建树的时间复杂度为O(n)。故使用pos变量作为指针在字符串上移动,根据’('符号进行递归建树。

在对于重复子树的判断上,建议使用unordered_map,unordered_map本质上是一个哈希表,在没有顺序要求的情况下,仅进行简单的查找操作最高可达到O(1)的时间复杂度,这取决于哈希的优秀性。

用编码的方式给每个子树赋予一个唯一的特征,再进行哈希。

最后递归打印即可。

key=key*(long long)1e10+node[cur].lson*(long long)1e5+node[cur].rson;

代码如下:

#include<bits/stdc++.h>
using namespace std;
struct Node{
	string data;
	int lson,rson;
	Node(string d="",int l=0,int r=0):data(d),lson(l),rson(r){};
}node[50005];
string s;
int vis[50005];
int cnt;
int build(int&pos,unordered_map<long long,int>& m)
{
	int start=pos;
	int cur=cnt++;
	long long key=0;
	while(pos<s.length()&&isalpha(s[pos])){
		key=key*27+s[pos]-'a'+1;
		pos++;
	}
	node[cur]=Node(s.substr(start,pos-start));
	if(pos<s.length()&&s[pos]=='('){
		node[cur].lson=build(++pos,m);
		node[cur].rson=build(++pos,m);
		pos++;
	}
	key=key*(long long)1e10+node[cur].lson*(long long)1e5+node[cur].rson;
	if(!m.count(key)){
		m[key]=cur;
	}
	else cnt--;
	return m[key];
}
void print_ans(int root,int sign)
{
	if(vis[root]==sign){
		printf("%d",root);
		return ;
	}
	vis[root]=sign;
	printf("%s",(node[root].data).c_str());
	if(node[root].lson==0)return ;
	printf("(");
	print_ans(node[root].lson,sign);
	printf(",");
	print_ans(node[root].rson,sign);
	printf(")");
	return ;
}
int main(void)
{
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>s;
		int pos=0;
		cnt=1;
		unordered_map<long long,int> m;
		build(pos,m);
		print_ans(1,t);
		printf("\n");
	}
//	fclose(stdout); 
//	fclose(stdin);
}

附上unordered_map和map在各种操作上的时间复杂度的对比。
在这里插入图片描述

[Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等) 本文介绍了在Dify插件中实现文件对象返回的方法。通过create_blob_message()函数,开发者可以输出txt、Excel等格式文件,让用户直接下载而非复制文本。文章详细讲解了二进制文件生成的原理,提供了文本翻译和Excel报表生成的代码示例,并列出常见MIME类型对照表。这种技术能显著提升插件实用性,特别适用于翻译、报表生成等需要文件输出的场景,使交互体验从"复制粘贴"升级为"一键下载"。 阅读详情

相关推荐

RDMA 出现背景、如何实现?如何测试连通性?

文章目录一、背景:1、传统的 网络通信:2、传统网络通信的问题:二、RDMA :1、出现背景:2、RDMA 简介:3、如何工作:4、RDMA 与 Infiniband 的关系:5、支持 RDMA 的其他协议:6、RDMA 的优势:7、通过 Infiniband 实现 RDMA :8、如何测试 RDMA 连通性:   一、背景: 1、传统的 网络通信:     &n...

郑泽林 2162

UVA12219 公共表达式消除 表达式树的建立应用

Let the set Σ consist of all words composed of 1-4 lower case letters, such as the words "a", "b", "f", "aa", "fun" and "kvqf". Consider expressions according to the grammar with the two rules  E ->

QiHang的博客 530

新手必看:四旋翼无人机PID调参实战指南(附常见问题排查)

本文为四旋翼无人机新手提供PID调参实战指南,详细解析Kp、Ki、Kd参数的实际意义及调参技巧,包含常见问题排查方法。通过系统化的调参流程和实用参考表,帮助用户快速掌握无人机飞行控制核心技能,避免常见错误,提升飞行稳定性与响应性能。

k0l1m2n3o的博客 599

Uva12219

自己写了个代码,本来还沾沾自喜,因为刘汝佳老师是把树的结构建立起来以后再遍历了一遍,我是一边建树一边打印。结果发现TLE了,网友指点才发现时间卡得有点紧,所以遍历一定要做到O(n)才可以…但是这个代码沿袭了刘老师表达式树的idea所以并没有能O(n)… #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cstdlib...

Hesy_H的博客 600

Halcon实战:基于图像清晰度自动筛选最佳对焦图片

本文详细介绍了如何使用Halcon实现基于图像清晰度的自动筛选最佳对焦图片技术。通过分析灰度值统计和标准差等核心指标,结合实战代码示例,帮助开发者高效处理工业检测中的对焦问题,提升自动化检测的准确性和效率。

weixin_27015733的博客 438

DrawCall、Batches、SetPassCalls的区别和联系

一、DrawCall、Batches、SetPassCalls的基本理解 我们先从图形渲染的角度对这些概念做一个基本的理解。 1.1 DrawCall DrawCall实际上指的是一次图形渲染接口的调用,比如OpenGL的glDrawArrays或者glDrawElements的一次调用,以及DirectX的DrawPrimitive或者DrawIndexedPrimitive。因此,DrawCall可以简单理解为一次渲染指令调用。 1.2 Batches 我们知道,在调用DrawCall之前,需要设置渲染

远行's Blog 6377

UVA - 12219(唯一性标记法的应用)

题目就是用先建立#include #include #include #include #include #include #include #include using namespace std; typedef long long LL; const int maxn = 505555; struct node{ int c; int l,r; node(int

playwfun的专栏 1157

破晓之光:GTK#框架让C# WinForm程序跨平台运行的终极指南

GTK#框架的出现,彻底打破了C# WinForm只能在Windows上运行的桎梏。

墨夶的博客 604

UVa 12219

题意大体是给定一个字符串,根据字符串建树,然后可以把树化简成一个图,最后根据图输出一行字符串 思路       映射 题目就是要求化简子树,使每一个子树都唯一存在,可以用一个三元组SubTree(root, l, r)代表整个子树,root是当前子树根的字符串, l是当前子树的左子树,r是当前子树的右子树,每次用map查询可以实现O(logn)的查询,建树的时候直接从左到右

Face the light 604

【Segment Anything Model】三:SAM模型微调自定义数据集,更改混合提示方式:点,框,点框混合

1.微调SAM预备知识。

cvxiayixiao的博客 1万+

【HALCON 25.11 + C#】 01:2026年工业机器视觉实战详解(从入门到精通)

2026年机器视觉市场规模将突破230亿美元,HALCON 25.11的革命性更新与C#的工业集成优势形成黄金技术栈。本文作为付费专栏开篇序章,聚焦“为什么现在必须学25.11+C#”的核心问题,通过真实工业案例、五项核心技术突破、联合编程架构优势及30篇系统学习路线,全方位论证其投资价值。读者将掌握持续学习、深度OCR加速等关键技能,获得可直接上产线的工业级代码资产与架构设计思维,解决柔性生产、边缘部署等核心痛点,成为具备技术溢价的机器视觉工程师。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1218

Golang编译优化——公共子表达式消除

公共子表达式消除(Common Subexpression Elimination,CSE)也有书上称为冗余表达式消除,旨在减少程序中重复计算相同表达式的次数,从而提高程序的执行效率。在程序中,如果同一个表达式在不同的地方多次出现并且具有相同的输入,则这个表达式就是一个公共子表达式。公共子表达式消除的目标是识别这些重复的表达式,并将它们计算一次,然后在需要时重用结果,而不是每次都重新计算。在这个例子中,表达式b + c在两个地方都出现了,它是一个公共子表达式。如果程序执行这两个语句,那么每次都重新计算。

yelvens的博客 1974

msf后渗透之获取登入password、远程控制、调用摄像头

在terminal输入load kili creds_all直接获取密码(不一定成功) 使用kiwi_cmd sekurlsa::logonpasswords获取密码

m0_61506558的博客 2964

UVa 12219 Common Subexpression Elimination

本文研究了一种将表达式树转换为最小节点数DAG的方法。给定由1到4个小写字母组成的单词集合定义的表达式语法,要求将重复出现的子树只存储一次。通过递归解析表达式树,规范化子树结构以识别相同子树,并在输出时动态分配编号来实现优化。关键方法是:为每个子树建立三元组标识(name, leftId, rightId),使用映射表避免重复分配;在输出过程中,先输出节点名称并立即分配输出编号,确保后续引用该节点时编号已存在。算法复杂度为O(n log n),适用于最多50,000个节点的表达式树。这种方法有效减少了存储空

寂静山林 687

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

uva 12219 Common Subexpression Elimination

这道题写得极度痛苦。题都看了半天 总结一下自己遇到的坑点: 1.map<node,int>和map<*node,int>。由于需要重载<符号,map<*node,int>无法调用struct node中的<重载。 2.hash=hash*27+s[p]-'a'+1中+1是必要的,如果不加,'aa','aaa'hash值为0,冲突 #include<iostream> #include<algorithm> #inc...

qq_35752161的博客 302

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

uva12219 Common Subexpression Elimination

dfs+hash

YHaX的博客 387

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

UVA 12219 Common Subexpression Elimination(STL)

题意就是求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号。 做法:因为需要一一比较,所以把树给编号,方法是用根节点的字符串加左子树编号以及右子树编号。这样经过一次dfs就可以知道哪些是有重复的了。他要输出的编号可以用一个全局变量x,过程中遇到新的字符串就加加,如果这个树与子树是前面出现过的,那么就把x--。结构体里不仅要保存根节点字符串,左右子树编号,还要保存第一次出现的位置,

glq007的acm的奋斗 1143

uva 12219 - Common Subexpression Elimination

Description Let the set Σ consist of all words composed of 1-4 lower case letters, such as the words “a”, “b”, “f”, “aa”, “fun” and “kvqf”. Consider expressions according to the grammar with the two...

AC__GO的博客 420

Common Subexpression Elimination UVA - 12219

问题 分析 就是建树,然后使用map和数组将子树映射成编号 用一个数据结构存储树,只保存子树的编号和自己的hash,string,然后就可唯一确定自己的编号 注意: 不能让a对应0 tnode.hash=tnode.hash*27+(*ptr-‘a’+1);// 区分aaa和a #include <iostream> #include <cstdio> #include &...

zpf1998的博客 189

UVA - 12219 Common Subexpression Elimination

Let the set Σ consist of all words composed of 1-4 lower case letters, such as the words “a”, “b”, “f”, “aa”, “fun” and “kvqf”. Consider expressions according to the grammar with the two rules E → f E → f(E, E) for every symbol f ∈ Σ. Any expression can ea

苦鬼·。 606

uva12219 Common Subexpression Elimination (表达式树,树hash+map)

Common Subexpression Elimination Let the set Σ consist of all words composed of 1-4 lower case letters, such as the words “a”, “b”, “f”, “aa”, “fun” and “kvqf”. Consider expressions according to the g...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 414

UVa #12219 Common Subexpression Elimination (例题11-1)

这题和普通的表达式树很像,但如果按照一般的做法(用L、R代表范围),会TLE,因为重复了太多无用的扫描 这题树中的结点对应的子树都是二叉树,不存在只有一个儿子的情况。输入的字符串中也只有两种情况,结点名字后面紧跟一个左括号的,和不跟括号的。 因此很容易判断一个结点是否为叶子结点:只要在原字符串中看他后面有没有紧跟着左括号就行了。如果有,立刻递归建树作为左子树。因为有左子树就一定有右子树

专攻挖掘机炒鸡蛋算法的专栏 1762

UVA-12219 Common Subexpression Elimination

思路见紫书第十一章例题11-1#include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; #include&lt;cmath&gt; #include&lt;map&gt; using namespace std; const int maxn=50000+10;...

wl16wzl的博客 622

hash 表达式树 UVa 12219 Common Subexpression Elimination

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=853&page=show_problem&problem=3371 题意就是求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号。 紫书354 #include #include #include using nam

ACM_10000h的专栏 741
上一篇: UVA 1412 Fund Management (复杂状态的DP,状态池)
下一篇: UVA 1151 Buy or Build(最小生成树,Kruskal)
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值