UVA 12219 Common Subexpression Elimination
题意:
求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号。
分析:
用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示。用build函数先根据输入的语句建树。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
const int maxlen = 5e5;
const int maxn = 5e4+1;
char str[maxlen];
map<string,int>smp;
map<string,int>::iterator sit;
vector<string>st;
struct node
{
int l,r;
int id;
int v;
bool operator < (const node& x) const{
return id<x.id || (id==x.id && (l < x.l || (l == x.l && r < x.r) ));
}
}tree[maxn];
map<node,int>mp;
map<node,int>::iterator it;
int cnt;
int dfs1;
int SID(string &s)
{
if((sit=smp.find(s))!=smp.end())
return sit->second;
st.push_back(s);
smp.insert(make_pair(s,st.size()));
return st.size();
}
int ID(node &nd)
{
if((it=mp.find(nd))!=mp.end())
return it->second;
mp.insert(make_pair(nd,cnt));
tree[cnt]=nd;
return cnt++;
}
int build(int x,int &len)
{
node u;
u.v=0;
string s;
int i;
for(i=x;str[i];i++)
{
if(str[i]==','||str[i]==')')
{
s.assign(str+x,str+i);
u.id=SID(s);
len=s.size();
u.l=u.r=-1;
return ID(u);
}
else if(str[i]=='(')
{
s.assign(str+x,str+i);
u.id=SID(s);
int lsz,rsz;
u.l=build(++i,lsz);
i+=lsz;
u.r=build(++i,rsz);
len=s.size()+lsz+rsz+3;
return ID(u);
}
}
s.assign(str+x,str+i);
u.id=SID(s);
u.l=u.r=-1;
return ID(u);
}
void dfs(int u)
{
if(!tree[u].v)
{
tree[u].v=++dfs1;
printf("%s",st[tree[u].id-1].c_str());
}
else
{
printf("%d",tree[u].v); return;
}
if(~tree[u].l)
{
putchar('(');
dfs(tree[u].l);
putchar(',');
dfs(tree[u].r);
putchar(')');
}
}
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
gets(str);
smp.clear();
mp.clear();
st.clear();
cnt=0;
int len;
int root=build(0,len);
dfs1=0;
dfs(root);
printf("\n");
}
}
UVA 12219 Common Subexpression Elimination的更多相关文章
- UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理 直接map离散.当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000. ...
- 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)
题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- uva 10252 - Common Permutation 字符串水题
题意:給定兩個小寫的字串a與b,請印出皆出現在兩字串中的字母,出現的字母由a~z的順序印出,若同字母出現不只一次,請重複印出但不能超過任一字串中出現的次數.(from Ruby兔) 很水,直接比较输出 ...
- 公共表达式消除(UVa 12219)
紫书354页的题,将表达式树进行公共表达式消除,化为等价的图.因为需要判断某一个是否出现过,所以需要快速比较,采用哈希表的形式,将a~b与1~27一一对应,不采用0,因为0与0000是相同的,对于每一 ...
- UVa 12219 公共表达式消除
https://vjudge.net/problem/UVA-12219 题意: 用表达式树来表示一个表达式. 思路: 用map来记录出现过的子树.如(b,3,6)表示这棵子树的根为b,左子树为编号为 ...
- 紫书 例题 11-1 UVa 12219 (表达式树)
这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- TensorFlow 源代码初读感受
把自己微博发的文章:http://www.weibo.com/1804230372/En7PdlgLb?from=page_1005051804230372_profile&wvr=6& ...
随机推荐
- myeclipse集成weblogicserver
今天为了学一下JMS的东东, 不得不安装个weblogicserver, 下面是详细的安装步骤: 1. 首先去官网下载一个weblogic: 下载地址: http://download.oracle. ...
- Cocos2d-x游戏开发CCBAnimationManager控制动画
CocosBuilder能方便的编辑各种动画.大部分动画都是以独立片段的形式存在的. 须要由程序来控制何时播放. 管理ccbi文件的动画播放有个专门的类:CCBAnimationManager 大致的 ...
- HDU 2030 统计汉字
BestCoder官方群:385386683 欢迎加入~ 寻人启事:2014级新生看过来! 汉字统计 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Excel中将时间格式转化成时间戳格式
时间戳转成正常日期的公式:C1=(A1+8*3600)/86400+70*365+19其中A1表示当时的1249488000时间戳数值其中C1就是所需的日期格式,C1单元格属性改成日期格式就可以了.正 ...
- Extjs 6 MVC开发模式(二)
1.Extjs MVC开发模式 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs4.x版本中引入了MVC开发模式,开始将 ...
- asp.net + Jquery 实现类似Gridview功能 (一)
不知不觉2015年就过去一半了,由于过年前后公司人员陆续离职(这个...),项目忙不过来,从过年来上班就一直在忙,最近项目终于告一段落,开始步入正轨(不用天天赶项目了).所以最近才有时间写这个东西,可 ...
- [转]WCF:如何将net.tcp协议寄宿到IIS
本文转自:http://www.cnblogs.com/Gyoung/archive/2012/12/11/2812555.html 1 部署IIS 1.1 安装WAS IIS原本是不支持非HTTP协 ...
- Oracle中中文、数字,英文混杂形式的字段进行排序的方法
http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...
- 写sql语句注意事项
做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...
- 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言
我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 2015-08-06 猿圈 我用爬虫一天时间“偷了”知乎一百万用户 只为证明PHP是世界上最好的语言 看了不少朋友圈里推荐的P ...