UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理
直接map离散。当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000。
需要注意的是有可能只有一个结点。
#include<bits/stdc++.h>
using namespace std; const int maxlen = 5e5;
const int maxn = 5e4+;
char str[maxlen]; map<string,int> smp;
map<string,int>::iterator sit;
vector<string> scache;
#define PB push_back
struct Node
{
int l,r;
int sid;
int Hash;
bool operator < (const Node& x) const{
return sid<x.sid || (sid==x.sid && (l < x.l || (l == x.l && r < x.r) ));
}
}tr[maxn]; map<Node,int> mp;
map<Node,int>::iterator it;
#define se second
#define fi first
#define MP make_pair int id_cnt; int SID(string &s)
{
if((sit = smp.find(s)) != smp.end()) return sit->se;
scache.PB(s);
smp.insert(MP(s,scache.size()));
return scache.size();
} int ID(Node &nd)
{
if((it = mp.find(nd)) != mp.end()) return it->se;
mp.insert(MP(nd,id_cnt));
tr[id_cnt] = nd;
return id_cnt++;
} int build(int x,int &len)
{
Node u; u.Hash = ;
string s;
int i;
for(i = x; str[i]; i++){
if(str[i] == ',' || str[i] == ')'){
s.assign(str+x,str+i);
u.sid = SID(s);
len = s.size();
u.l = u.r = -;
return ID(u);
}else if(str[i] == '('){
s.assign(str+x,str+i);
u.sid = SID(s);
int lsz, rsz;
u.l = build(++i,lsz);
i += lsz;
u.r = build(++i,rsz);
len = s.size()+lsz+rsz+;
return ID(u);
}
}
s.assign(str+x,str+i);//只有一个结点
u.sid = SID(s);
u.l = u.r = -;
return ID(u);
} int dfs_clock; void dfs(int u)
{
if(!tr[u].Hash){
tr[u].Hash = ++dfs_clock;
printf("%s",scache[tr[u].sid-].c_str());
}else {
printf("%d",tr[u].Hash); return;
}
if(~tr[u].l){
putchar('(');
dfs(tr[u].l);
putchar(',');
dfs(tr[u].r);
putchar(')');
}
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d\n",&T);
while(T--){
gets(str);
mp.clear(); id_cnt = ;
scache.clear(); smp.clear();
int len;
int root = build(,len);
dfs_clock = ;
dfs(root);putchar('\n');
}
return ;
}
UVa 12219 Common Subexpression Elimination (stl,模拟,实现)的更多相关文章
- UVA 12219 Common Subexpression Elimination
题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...
- 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)
题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- stl+模拟 CCF2016 4 路径解析
// stl+模拟 CCF2016 4 路径解析 // 一开始题意理解错了.... #include <iostream> #include <string> #include ...
- 【STL+模拟】UVa 506 - System Dependencies
System Dependencies Components of computer systems often have dependencies--other components that m ...
- UVA - 11995 - I Can Guess the Data Structure! STL 模拟
There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. ...
- uva 327 Evaluating Simple C Expressions 简易C表达式计算 stl模拟
由于没有括号,只有+,-,++,--,优先级简单,所以处理起来很简单. 题目要求计算表达式的值以及涉及到的变量的值. 我这题使用stl的string进行实现,随便进行练手,用string的erase删 ...
- STL——模拟实现空间配置器
目录 问题 SGI版本空间配置器-std::alloc 一级空间配置器 二级空间配置器 Refill.chunkAlloc函数 最后,配置器封装的simple_alloc接口 问题 我们在日常编写C+ ...
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
随机推荐
- Flutter实战视频-移动电商-20.首页_火爆专区上拉加载效果
20.首页_火爆专区上拉加载效果 上拉加载的插件比较都.没有一个一枝独秀的 可以自定义酷炫的header和footer 一直在更新 推荐使用这个插件: https://github.com/xuelo ...
- Flutter实战视频-移动电商-36.FlutterToast插件使用
36.FlutterToast插件使用 https://github.com/PonnamKarthik/FlutterToast fluttertoast: ^ category_page.dart ...
- bugfree-解决方案的意思
BugFree的7种解决方案各自的含义: By Design - 就是这么设计的,无效的Bug Duplicate - 这个问题别人已经发现了,重复的Bug External - 是个外部因素(比如浏 ...
- __doPostBack方法解析 __VIEWSTATE __EVENTTARGET __doPostBack __EVENTARGUMENT
关于这个的另一篇博客:http://www.cnblogs.com/Silicon-Fado/archive/2009/04/21/1440437.html __VIEWSTATE:页面状态信息在客户 ...
- 《剑指offer》面试题7—用两个栈实现队列
题目:给出队列声明,要求实现AppendTail和DeleteHead函数. template <typename T>class CQueue{public: void AppendTa ...
- uoj#276. 【清华集训2016】汽水(分数规划+点分治)
传送门 没想到点分治那一层-- 首先不难发现这是个分数规划,先把所有的边长减去\(k\),二分答案,设为\(mid\),就是要求路径平均值\(ans\in[-mid,mid]\) 先来考虑\(ans\ ...
- 【NOI省选模拟】小奇的花园
「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...
- MyBatist庖丁解牛(五)
很多时候我们在自己的每个service中没有中注入SqlSessionTemplate; 但是我们直接调用mapper接口方法就直接能够操作数据库 这个是为什么??下面开始解惑: Mybatis Sq ...
- kibana通过nginx配置访问用户验证
背景: 现在搭建好了efk,其中kibana是可以在网页上访问的可视化工具,搭建好的kibana默认没有访问控制权限,任何人都能访问,这样存在一些安全隐患和隐私问题.这里我把设置的访问验证过程记录一下 ...
- 087 Scramble String 扰乱字符串
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树.下图是字符串s1 = "great"的一种可能的表示形式. great / \ ...