题意:

  求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号。

分析:

  用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的更多相关文章

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

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

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

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

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

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

  4. uva 10252 - Common Permutation 字符串水题

    题意:給定兩個小寫的字串a與b,請印出皆出現在兩字串中的字母,出現的字母由a~z的順序印出,若同字母出現不只一次,請重複印出但不能超過任一字串中出現的次數.(from Ruby兔) 很水,直接比较输出 ...

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

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

  6. UVa 12219 公共表达式消除

    https://vjudge.net/problem/UVA-12219 题意: 用表达式树来表示一个表达式. 思路: 用map来记录出现过的子树.如(b,3,6)表示这棵子树的根为b,左子树为编号为 ...

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

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

  8. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

  9. TensorFlow 源代码初读感受

    把自己微博发的文章:http://www.weibo.com/1804230372/En7PdlgLb?from=page_1005051804230372_profile&wvr=6& ...

随机推荐

  1. 九度OnlineJudge之1032:ZOJ

    题目描述: 读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出. 输入: 题目包含多组用例,每组用例占一行,包含ZOJ三个 ...

  2. 一个非常给力的播放器video-js

    video-js采用的是html5播放器. 在不支持html5的浏览器会自动切换成flash. video-js的官网http://www.videojs.com/ 看看下载的demo就知道个大概了. ...

  3. AliCTF 2016

    上上周参加了阿里的CTF,靠着最后绝杀队伍有幸拿到了国内第一名,也顺利进入了XCTF Final.把自己做的几个题简单写了下,发出来也算个总结吧. PWN-FB 经典的null byte overfl ...

  4. android实现透明和半透明效果

    从透明到半透明时一个值的变化过程. #00000000(全透明)——#e0000000(半透明) 如果觉得半透明的效果太暗淡.可以设置成#60000000,#80000000,#a0000000等等

  5. JSP 基础之 JSTL <c:forEach>用法

    在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JST ...

  6. eclipse +cvs 的基本使用方法(一)

    很多时候我们在做项目开发时,会用到cvs,现在我给大家介绍一下关于eclipse下怎么使用cvs管理功能,eclipse本身是自带cvs的,我们只要简单设置一下让它连接到cvs服务器上.    看下图 ...

  7. 利用html5中的localStorage获取网页被访问的次数

    利用html5中的localStorage获取网页被访问的次数 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  8. jq插件又来了,模拟select下拉框,支持上下方向键哦

    好久没来了,更新下插件, 这个原理就是利用的 input[type='hidden']和自定义属性data-value捆绑传值操作的,可是设置默认选项,回调等参数,代码不多,比较简单,吼吼 (func ...

  9. microwindows Win32 API demo

    初次使用microwindows,资料有限,我也是费了很多功夫才明白.所以记录下来,好帮助那些爱学习的童鞋,另外请大虾们多多指教. 什么是microwindows,什么作用,等背景介绍我就不多说了,因 ...

  10. MySQL load data infile

    语法: load data [low_priority] [local] infile ‘file_path' [replace] [ignore] into table table_name [(c ...