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 公共表达式消除的更多相关文章

  1. 公共表达式消除(UVa 12219)

    紫书354页的题,将表达式树进行公共表达式消除,化为等价的图.因为需要判断某一个是否出现过,所以需要快速比较,采用哈希表的形式,将a~b与1~27一一对应,不采用0,因为0与0000是相同的,对于每一 ...

  2. 紫书 例题 11-1 UVa 12219 (表达式树)

    这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...

  3. sql server 公共表达式的简单应用(cte)

    一.前言 现在做项目数据访问基本都会选择一种orm框架,它以面向对象的形式屏蔽底层的数据访问形式,让开发人员更集中在业务处理上,而不是和数据库的交互上,帮助我们提高开发效率:例如一些简单的insert ...

  4. [Inside HotSpot] C1编译器优化:条件表达式消除

    1. 条件传送指令 日常编程中有很多根据某个条件对变量赋不同值这样的模式,比如: int cmov(int num) { int result = 10; if(num<10){ result ...

  5. 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)

    题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...

  6. uva 11234 Expressions 表达式 建树+BFS层次遍历

    题目给出一个后缀表达式,让你求从下往上的层次遍历. 思路:结构体建树,然后用数组进行BFS进行层次遍历,最后把数组倒着输出就行了. uva过了,poj老是超时,郁闷. 代码: #include < ...

  7. UVA 12219 Common Subexpression Elimination

    题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...

  8. UVa 12219 Common Subexpression Elimination (stl,模拟,实现)

    一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理 直接map离散.当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000. ...

  9. TF(1): 基础理论

    TensorFlow最初由Google大脑的研究员和工程师开发出来,用于机器学习和神经网络方面的研究,于2015.10宣布开源,在众多深度学习框架中脱颖而出,在Github上获得了最多的Star量.T ...

随机推荐

  1. Lodash入门介绍

    原文额地址  http://www.w3cplus.com/javascript/lodash-intro.html 有多年开发经验的工程师,往往都会有自己的一套工具库,称为 utils.helper ...

  2. vue使用resource传参数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. python2.7 环境配置

    1.安装python2.7.8之后,配置环境变量:在path中配置python的安装路径 在cmd框中执行python,进入到python命令执行,即为配置成功. 2.执行过程中,提示缺少xlutil ...

  4. [LeetCode] 832. Flipping an Image_Easy

    Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...

  5. [LeetCode] 102. Binary Tree Level Order Traversal_Medium tag: BFS

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. git 下载单个文件 已经添加多个远程服务器

    175down vote It is possible to do (in the deployed repository) git fetch followed by git checkout or ...

  7. jstack生成的Thread Dump日志结构解析

    1 第一部分:Full thread dump identifier 2 第二部分:Java EE middleware, third party & custom application T ...

  8. Jtester+unitils+testng:DAO单元测试文件模板自动生成

    定位 本文适合于不愿意手工编写而想自动化生成DAO单元测试的筒鞋.成果是不能照搬的,但其中的"创建模板.填充内容.自动生成"思想是可以复用的.读完本文,可以了解 Python 读取 ...

  9. Linux基础命令---e2fsck

    ex2fsck 检查ext2.ext3.ext4文件系统,如果系统已经挂载了,那么不建议去检查,因为这样是不安全的.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.op ...

  10. 简化document.createElement("div")动态生成层方法

    我们在WEB开发时,很多时候往往需要我们 JavaScript 来动态建立 html 元素,动态的设置相关的属性.比方说我们想要建立一個 div 层,则可以使用以下代码实现. 一.直接建立functi ...