codeforces gym 100357 K (表达式 模拟)
题目大意

将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式。
解题分析
用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号。如果优先级相同,则如果是左结合性(+,-,*,/)则选择最右边的一个,如果是右结合性(^)则选择最最左边的一个。
主要恶心的地方在于输出上。主要是记录一下每个点和符号的位置,在递归和返回时传递一些参数。
ps:虽然输出比较恶心,但最终实现出来后还是感到十分地身心愉悦。
参考程序
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
string s;
int a[];
int level(char ch)
{
switch (ch)
{
case '+':;
case '-':return ;
case '*':;
case '/':return ;
case '^':return ;
default:return ;
}
} int r,c,tmp=; struct node{
int l,mid,r,len;
char ch;
}w[]; pii solve(int x,int y,int heap,int op)
{
//cout<<s.substr(x,y-x+1)<<endl;
if (heap>r) r=heap;
if (op>c) c=op;
while (s[x]=='(' && s[y]==')')
{
int t=,flag=;
for (int i=x+;i<=y-;i++)
{
if (s[i]=='(') t++; else if (s[i]==')') t--;
if (t<) flag=;
}
if (flag)
{
x++;
y--;
}
else break;
}
int len=y-x+;
if (len==)
{
w[++tmp]=(node){op,op,op,heap,s[x]};
return pii(,);
}
for (int i=x;i<=y;i++) a[i]=;
if (s[x]=='(') a[x]=; else a[x]=;
for (int i=x+;i<=y;i++)
if (s[i]=='(') a[i]=a[i-]+; else
if (s[i]==')') a[i]=a[i-]-; else
a[i]=a[i-];
int p=,mx=;
for (int i=x;i<=y;i++)
{
if (a[i]==)
if (s[i]=='^' && level(s[i])<mx || s[i]!='^' && level(s[i])<=mx )
{
p=i;
mx=level(s[i]);
}
}
pii left=solve(x,p-,heap+,op);
int now=op+left.second+;
pii right=solve(p+,y,heap+,now+);
w[++tmp]=(node){op+left.first-,op+left.second+,now+right.first+-,heap,s[p]};
return pii(left.second+,left.second++right.second);
}
int cmp(const node &a,const node &b)
{
return a.len<b.len || a.len==b.len && a.mid<b.mid;
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
cin>>s;
pii p=solve(,s.length()-,,);
sort(w+,w+tmp+,cmp);
for (int h=;h<=w[tmp].len;h++)
{
int i,j;
for (i=;w[i].len!=h;i++);
for (j=i;w[j+].len==h;j++);
if (h!=)
{
for (int t=;t<=w[i].mid-;t++) printf(" ");
printf("|");
for (int k=i+;k<=j;k++)
{
for (int t=w[k-].mid+;t<=w[k].mid-;t++) printf(" ");
printf("|");
}
printf("\n");
}
for (int t=;t<=w[i].l-;t++) printf(" ");
if (level(w[i].ch)!=) printf(".");
for (int t=w[i].l+;t<=w[i].mid-;t++) printf("-");
if (level(w[i].ch)!=) printf("[");
printf("%c",w[i].ch);
if (level(w[i].ch)!=) printf("]");
for (int t=w[i].mid+;t<=w[i].r-;t++) printf("-");
if (level(w[i].ch)!=) printf(".");
for (int k=i+;k<=j;k++)
{
for (int t=w[k-].r+;t<=w[k].l-;t++) printf(" ");
if (level(w[k].ch)!=) printf(".");
for (int t=w[k].l+;t<=w[k].mid-;t++) printf("-");
if (level(w[k].ch)!=) printf("[");
printf("%c",w[k].ch);
if (level(w[k].ch)!=) printf("]");
for (int t=w[k].mid+;t<=w[k].r-;t++) printf("-");
if (level(w[k].ch)!=) printf(".");
}
printf("\n");
}
}
codeforces gym 100357 K (表达式 模拟)的更多相关文章
- Codeforces Gym 100851 K King's Inspection ( 哈密顿回路 && 模拟 )
题目链接 题意 : 给出 N 个点(最多 1e6 )和 M 条边 (最多 N + 20 条 )要你输出一条从 1 开始回到 1 的哈密顿回路路径,不存在则输出 " There is no r ...
- Codeforces Gym 100187K K. Perpetuum Mobile 构造
K. Perpetuum Mobile Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
- codeforces gym 100971 K Palindromization 思路
题目链接:http://codeforces.com/gym/100971/problem/K K. Palindromization time limit per test 2.0 s memory ...
- Codeforces Gym 100523K K - Cross Spider 计算几何,判断是否n点共面
K - Cross SpiderTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/v ...
- codeforces gym 100357 H (DP 高精度)
题目大意 有r*s张扑克牌,数字从1到 r,每种数字有s种颜色. 询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率. 解题分析 对于组成顺子的概率,令dp[i][j][k]表示一共选 ...
- codeforces gym 100357 I (费用流)
题目大意 给出一个或与表达式,每个正变量和反变量最多出现一次,询问是否存在一种方案使得每个或式中有且仅有一个变量的值为1. 解题分析 将每个变量拆成三个点x,y,z. y表示对应的正变量,z表示对应的 ...
- codeforces gym 100357 J (网络流)
题目大意 有n种物品,m种建筑,p个人. n,m,p∈[1,20] 每种建筑需要若干个若干种物品来建造.每个人打算建造一种建筑,拥有一些物品. 主角需要通过交易来建造自己的建筑,交易的前提是对方用多余 ...
- codeforces gym 101164 K Cutting 字符串hash
题意:给你两个字符串a,b,不区分大小写,将b分成三段,重新拼接,问是否能得到A: 思路:暴力枚举两个断点,然后check的时候需要字符串hash,O(1)复杂度N*N: 题目链接:传送门 #prag ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
随机推荐
- 平方分割poj2104K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 59798 Accepted: 20879 Ca ...
- 贪心 Codeforces Round #135 (Div. 2) C. Color Stripe
题目传送门 /* 贪心:当m == 2时,结果肯定是ABABAB或BABABA,取最小改变量:当m > 2时,当与前一个相等时, 改变一个字母 同时不和下一个相等就是最优的解法 */ #incl ...
- Mui使用jquery并且使用点击跳转新窗口
网上好多朋友是这样做的: 全局插入了js代码 mui('body').on('tap', 'a', function () { document.location.href = this.href; ...
- poj1240 Pre-Post-erous!
思路: 根据前序序列和后序序列递归构造m叉树,确定每个节点的子节点数量.再用组合数公式累乘. 实现: #include <iostream> using namespace std; ][ ...
- FCC 基础JavaScript 练习4
1.另一种数据类型是布尔(Boolean).布尔 值要么是true要么是false, 它非常像电路开关, true 是“开”,false是“关”.这两种状态是互斥的 2.伪代码 if(条件为真){ 语 ...
- React 篇 Search Bar and content Table
我们要构建一个模块,其中包含一个内容显示的表格,然后上面有一个提供Search的栏位,并对Search中输入栏进行监听,当有改变的时候,触发Search然后对内容表中的内容进行过滤. Demo Lin ...
- swift 扩展 要素总结
类: 协议: 泛型及元素类型:扩展约束:
- swift protocol 与类继承结合时的bug
protocol CommonTrait: class { func commonBehavior() -> String } extension CommonTrait { func comm ...
- ES6字符串模板
这里做个简单的拓展,之前做vue组件时,经常用到拼接字符串,换行时用到\,既费时又麻烦.这里介绍个ES6字符串模板方法 旧版拼接(各种换行拼接) Vue.component('obj-prop',{ ...
- oracle 备份/恢复
oracle备份是为了有问题能够快速恢复: