UVa 12219 公共表达式消除
https://vjudge.net/problem/UVA-12219
题意:
用表达式树来表示一个表达式。
思路:
用map来记录出现过的子树。如(b,3,6)表示这棵子树的根为b,左子树为编号为3的子树,右子树为编号为6的子树。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std; const int maxn = ;
char s[maxn * ], *p;
int cnt, kase;
int vis[maxn]; struct node
{
string s; //因为运算数是1~4个小写字母,所以这里要用string
int left, right;
bool operator < (const node& rhs) const //有map,所以一定要重载
{
if (s != rhs.s) return s < rhs.s;
if (left != rhs.left) return left < rhs.left;
return right < rhs.right;
}
}tree[maxn]; map<node, int>dict; int solve()
{
int id = ++cnt; //从1开始编号
node& t = tree[id]; //引用,比较方便
t.s = "";
t.left = t.right = -;
while (*p >= 'a' && *p <= 'z') //先把根输入进去
{
t.s.push_back(*p);
p++;
} //递归处理左右子树
if (*p == '(')
{
p++; //跳过'('
t.left = solve(), p++; //跳过','
t.right = solve(), p++; //跳过')'
} if (dict.count(t)) //如果已经出现过
{
cnt--;
return dict[t]; //直接返回子树编号
}
return dict[t] = id; //没出现过,编号并返回
} void print(int u)
{
if (vis[u]==kase) cout << u ; //如果子树已经输出过,直接输出编号
else
{
vis[u] = kase;
cout << tree[u].s;
//递归输出左右子树
if (tree[u].left != -)
{
cout << "(";
print(tree[u].left);
cout << ",";
print(tree[u].right);
cout << ")";
}
}
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int T;
cin >> T;
for (kase = ; kase <= T;kase++)
{
dict.clear();
cnt = ;
cin >> s;
p = s;
print(solve()); //返回根编号,递归输出
cout << endl;
}
return ;
}
UVa 12219 公共表达式消除的更多相关文章
- 公共表达式消除(UVa 12219)
紫书354页的题,将表达式树进行公共表达式消除,化为等价的图.因为需要判断某一个是否出现过,所以需要快速比较,采用哈希表的形式,将a~b与1~27一一对应,不采用0,因为0与0000是相同的,对于每一 ...
- 紫书 例题 11-1 UVa 12219 (表达式树)
这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...
- sql server 公共表达式的简单应用(cte)
一.前言 现在做项目数据访问基本都会选择一种orm框架,它以面向对象的形式屏蔽底层的数据访问形式,让开发人员更集中在业务处理上,而不是和数据库的交互上,帮助我们提高开发效率:例如一些简单的insert ...
- [Inside HotSpot] C1编译器优化:条件表达式消除
1. 条件传送指令 日常编程中有很多根据某个条件对变量赋不同值这样的模式,比如: int cmov(int num) { int result = 10; if(num<10){ result ...
- 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)
题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...
- uva 11234 Expressions 表达式 建树+BFS层次遍历
题目给出一个后缀表达式,让你求从下往上的层次遍历. 思路:结构体建树,然后用数组进行BFS进行层次遍历,最后把数组倒着输出就行了. uva过了,poj老是超时,郁闷. 代码: #include < ...
- UVA 12219 Common Subexpression Elimination
题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...
- UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理 直接map离散.当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000. ...
- TF(1): 基础理论
TensorFlow最初由Google大脑的研究员和工程师开发出来,用于机器学习和神经网络方面的研究,于2015.10宣布开源,在众多深度学习框架中脱颖而出,在Github上获得了最多的Star量.T ...
随机推荐
- 001-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-第一章 阿里巴巴集团中台战略引发的思考
1.1.阿里中台发展 组件中台可能问题:组织间业务协作.业务核心能力的沉淀.组织KPI考核等 1.2.企业信息中心发展的症结 1.烟囱式系统建设模式 独立构建独立维护 缺点:1.重复功能建设和维护带来 ...
- vue学习之二ECMAScript6标准
一.ECMAScript6标准简述 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScr ...
- [py]处理文件的3个方法
file处理的3个方法: f和f.readlines效果一样 # f.read() 所有行 -> 字符串 # f.readline 读取一行 -> 字符串 # f.readlines 所有 ...
- weka源代码-总述
分类: 所有的分类器都继承自抽象类AbstractClassifier而AbstractClassifier继承自接口Classifier.集成关系如下图所示: 而类Classifier中主要包含以下 ...
- Postman使用js获取日期
在用postman进行接口自动化测试的时候,某个查询接口需要使用到日期参数进行请求: 假设当前日期为2018-05-07 10:30:20 ,需要传的日期为: beginTime:2018-05-01 ...
- 把 ElasticSearch 当成是 NoSQL 数据库
Elasticsearch 可以被当成一个 “NoSQL”-数据库来使用么? NoSQL 意味着在不同的环境下存在不同的东西, 而erestingly 它并不是真的跟 SQL 有啥关系. 我们开始只会 ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON LocalMin2
zw版[转发·台湾nvp系列Delphi例程]HALCON LocalMin2 procedure TForm1.Button1Click(Sender: TObject);var img : HUn ...
- Shell脚本实现每个工作日定时执行指定程序
我们可能会遇到这样的情景:必须在每个工作日定时执行Linux服务器上的某个程序.那么有没有办法实现这一功能呢?答案是肯定的.我们可以运用Shell脚本简单实现这一功能. 原理很简单,Shell脚本内部 ...
- OpenCV实现SfM(三):多目三维重建
http://lib.csdn.net/article/opencv/24548 注意:本文中的代码必须使用OpenCV3.0或以上版本进行编译,因为很多函数是3.0以后才加入的. 目录: 问题简化 ...
- django admin 使用
Django admin 中一些常用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索 ...