原题链接:点击此处

觉得这题好难呀!方法在紫书上,十一节公共表达式消除那小节(没带书回来,具体页数不清楚啦~)

这题树中的结点对应的子树都是二叉树,不存在只有一个儿子的情况。输入的字符串中也只有两种情况,结点名字后面紧跟一个左括号的,和不跟括号的。

因此很容易判断一个结点是否为叶子结点:只要在原字符串中看他后面有没有紧跟着左括号就行了。如果有,立刻递归建树作为左子树。因为有左子树就一定有右子树,所以左子树建完后就可以从字符串中左子树结束的位置开始建右子树了。因此不需要从左到右扫描寻找逗号来分割左右子树。

另外字符串的对比是缓慢的。鉴于这道题最多只有四个小写字母,也就是最多26*4种情况,我们完全可以用整数来代替字符串。一种比较简单的做法是把字符串看成一个四位的27进制数,并抛弃0,因为0和0000相等。

代码如下:

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<stdio.h>
using namespace std;void decode(int a) {vector<char> result;while(a) { result.push_back(a%27+'a'-1); a/=27; }       //%27+1for(int i = result.size() - 1; i >= 0; i --) {cout<<result[i];}
}struct Tree {int rcode, lch, rch;        //code of root. treeid of left and right sub-tree.
    Tree(){}Tree(int a, int b, int c):rcode(a), lch(b), rch(c) { }bool operator < (const Tree& rhs) const {if(rcode == rhs.rcode){if(lch == rhs.lch) return rch < rhs.rch;return lch < rhs.lch;}return rcode < rhs.rcode;}
};//Global Variables. Reset upon Each Case!
const int maxn = 50000+5;
int T, treecnt, vis[maxn], ans[maxn], cnt;
char str[5*(maxn+10000)], *p;
Tree trees[maxn];
map<Tree, int> tree_map;
/////int getTreeID(Tree& t)
{if(tree_map.count(t)) return tree_map[t];else{Tree& v = trees[treecnt];v = t;return tree_map[t] = treecnt++;}
}int parse()
{int lch = -1, rch = -1;int name = 0;while(isalpha(*p)) {name = name*27 + (*p-'a'+1);p ++;}if(*p == '(') {p++;lch = parse();p ++;rch = parse();p ++;}Tree tmp = Tree(name, lch, rch);return getTreeID(tmp);
}void print_ans(int id)
{if(ans[id] != -1) cout<<ans[id];else {ans[id] = ++cnt;decode(trees[id].rcode);if(trees[id].lch != -1){cout<<"(";print_ans(trees[id].lch);cout<<",";print_ans(trees[id].rch);cout<<")";}}
}int main()
{memset(vis, -1, sizeof(vis));cin>>T;while(T--){treecnt = cnt = 0;tree_map.clear();scanf("%s", str);p = str;memset(ans, -1, sizeof(ans));print_ans(parse());printf("\n");}return 0;
}

View Code

转载于:https://www.cnblogs.com/gdvxfgv/p/5721887.html

UVA 12219-Common Subexpression Elimination相关推荐

  1. TVM TIR Pass - CSE (Common Subexpression Elimination) 优化原理和代码解析 PR#9482

    理论 预备知识 TIR Let Binding Let (var, value, body) 将value求值赋给var,然后返回body的求值结果.let将表达式 Expr 绑定到局部作用域的不可变 ...

  2. 「日常训练」Common Subexpression Elimination(UVa-12219)

    今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...

  3. UVA 10405-Longest Common Subsequence

    最长公共子序列,值得注意的是这道题不能用scanf读字符串. #include<stdio.h>#include<string.h>#define MAXD 1005char ...

  4. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  5. AI基础架构Pass Infrastructure

    AI基础架构Pass Infrastructure • Operation Pass o OperationPass : Op-Specific o OperationPass : Op-Agnost ...

  6. 理解java虚拟机工作后了解吗,【深入理解JAVA虚拟机】第4部分.程序编译与代码优化.2.运行期优化。这章提到的具体的优化技术,应该对以后做性能工作会有帮助。...

    1.概述 Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码"(Hot Spot C ...

  7. Jvm 系列(十):Java 即时编译器JIT机制以及编译优化

    在部分的商用虚拟机中,Java 程序最初是通过解释器( Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为"热点代码" ...

  8. 内核compiler.h的学习

    版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/44962633 直接上代码就可以了,所以的学 ...

  9. OneAPM大讲堂 | 提高JavaScript性能的30个技巧

    文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 您是网站管理员还是网页开发人员?想创建超快速的网站吗? 今天我们来看看 JavaScript,这项神奇而又复杂的技术.它使网站内容 ...

最新文章

  1. 【C 语言】指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )
  2. 解惑(三)----- 深入理解Python中的self参数和__init__(self)方法--通过类比Java语言
  3. [SHOI2017]组合数问题
  4. CSS3菜单栏透明兼容问题
  5. java几种多线程_Java多线程实现的几种方式
  6. 对比 Ruby 和 Python 的垃圾回收
  7. html编辑器后怎么使用,html在线编辑器怎么用
  8. 图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割
  9. c语言指令保留字,C语言命令令、符号表
  10. IDEA 手动导入本地依赖包
  11. mysql查询多造一列_mysql某列多值查询_MySQL
  12. 打造集成SATA驱动程序的XP系统盘
  13. 关于分卷压缩文件打不开的问题
  14. 频谱感知3:合作频谱检测中的硬合并与软合并
  15. 动态链接库dll生成与调用 加密 电脑唯一识别 windows下多个cmd命令输出结果的同时获取 本地时间的处理
  16. python pdf编辑器开发_使用pymupdf开发pdf查看编辑器
  17. 游戏公司用IM软件 “颜值”和“手感”一个都不能少
  18. 魔兽世界怀旧服务器无限刷怪点,魔兽世界怀旧服:4处无限刷新的打怪点!升级比血色站桩还快!...
  19. html5的水墨画,PR怎么做水墨画效果
  20. TLE(两行轨道数据)卫星行李数据格式解析

热门文章

  1. js判断wifi_使用JS在浏览器中判断当前网络连接状态的几种方法
  2. 电路中滤波电容和退耦电容_电子电路中电容的作用,滤波消抖,充放电,耦合,退耦...
  3. 【nginx】return 301 302 重定向URL
  4. 严重: A child container failed during start
  5. jmeter连接MySQL出错_MySQL数据库之jmeter连接mysql数据库报错Cannot create PoolableConnectionFactory...
  6. JNDI配置DataResource代替JDBC连接数据库
  7. centos 安装java_在CentOS8上编译安装开源EDA工具——Surelog
  8. 向量程序C语言,一个有关向量与矩阵的实用计算器程序
  9. Spark Streaming(三)zookeepe搭建
  10. Python模块学习 ---- re正则表达式