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& ...
随机推荐
- Arrays.copyof
public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System. ...
- IOS准备
1.Commond + shift + H 相当于Home键 2.更改项目的名称和icon图标 info.plist文件->bundle name -> 写上工程显示的名字 3.更改ico ...
- 在windows中使用VMWare安装Mac OS 10.7
请参考http://www.cnblogs.com/huwlnew/archive/2011/11/15/2250342.html http://unmi.cc/vmware9-install-mac ...
- 转载-SQL不同服务器数据库之间的数据操作整理(完整版) .
---------------------------------------------------------------------------------- -- Author : htl25 ...
- core-site.xml配置项:hadoop.tmp.dir
hadoop.tmp.dir:A base for other temporary directories. 集群运行后,修改该配置项后,发现类似错误: -- ::, INFO org.apache. ...
- Hadoop学习之常用命令
HADOOP基本操作命令 在这篇文章中,我们默认认为Hadoop环境已经由运维人员配置好直接可以使用. 假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与 ...
- java+mysql中文乱码问题
乱码问题原因有多种,其中有一种是由于MySQL默认使用 ISO-8859-1 ( 即Latin1 ) 字符集,而JAVA内部使用Unicode编码,因此在JAVA中向MYSQL数据库插入数据时,或者读 ...
- ie8下的透明 问题
团队里经常遇到,索性整理一起 是我们在前端开发中经常遇到的,在问题中经常遇到的两个问题是背景色透明和整体透明 先说下背景色透明,背景色透明,在现代浏览器中,可以用rgba颜色作为背景色. 简单介绍下r ...
- python运维开发(十四)----HTML基本操作
内容目录: HTML概述 head标签 body中常用标签 css选择器 css常用属性 HTML HTML概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言) ...
- MVC4 Win2008 aspnet_isapi配置问题
win2008下配置共2步 1.先确保你的应该程序池选择了asp.net 4.0框架 2.添加脚本映射(解决URL不能重写) 3.添加通配符脚本映射(解决图片不能显示) IIS中的Web应用程序有两种 ...