poj2269 Friends
计算表达式。
只有3种运算符:*,+,- ,
*优先级高于后两者,后两者优先级相同。
有两种符号:{},()。
利用递归和堆栈即可解决。
首先遇到左括号开始入栈直到遇到右括号,遇到右括号时对括号内的数进行计算。
考虑到*优先级较高,因此遇到*直接对其左右集合进行运算。
最后得到不含括号和*的表达式,从左往右计算即可。
http://poj.org/problem?id=2269
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = ;
const int maxc = ;
char buf[maxn];
int stack[maxn][maxc];
char op[maxn];
int p, k;
int vis[maxc]; void caculate(){
//meeting eol or right paren RETURN
if(buf[p] == '\0' || buf[p] == ')') return;
if(buf[p] == '('){
int k1 = k;
++p, caculate();
//guarantee that all contents in the paren computed
//figure out the current result
for(int i = k1 + ; i < k; i++){
memset(vis, , sizeof vis);
int o = op[i] == '+' ? : -;
for(int j = ; j <= stack[k1][]; j++) ++vis[stack[k1][j]];
for(int j = ; j <= stack[i][]; j++) vis[stack[i][j]] += o;
stack[k1][] = ;
for(int j = ; j < ; j++) if(vis[j] > ) stack[k1][++stack[k1][]] = j;
}
k = k1 + ;
++p, caculate();
}
else if(buf[p] == '{'){
++p;
stack[k][] = ;
for(int i = p; buf[i] != '}'; i++, ++p) stack[k][++stack[k][]] = buf[i] - 'A';
k++;
p++;
caculate();
}else if(buf[p] == '*'){
if(buf[p + ] == '(') ++p, caculate();
else if(buf[p + ] == '{'){
++p;
stack[k][] = ;
for(int i = p; buf[i] != '}'; i++, ++p) stack[k][++stack[k][]] = buf[i] - 'A';
k++;
++p;
}
//caculate stack[k - 2] * stack[k - 1] to update stack[k - 2]
memset(vis, , sizeof vis);
for(int i = ; i <= stack[k - ][]; i++) ++vis[stack[k - ][i]];
for(int i = ; i <= stack[k - ][]; i++) ++vis[stack[k - ][i]];
stack[k - ][] = ;
for(int i = ; i < ; i++) if(vis[i] == ) stack[k - ][++stack[k - ][]] = i;
--k;
caculate();
}else{
op[k] = buf[p];
++p;
caculate();
}
} void solve(){
k = p = ;
memset(vis, , sizeof );
caculate();
for(int i = ; i < k; i++){
memset(vis, , sizeof vis);
int o = op[i] == '+' ? : -;
for(int j = ; j <= stack[i - ][]; j++) ++vis[stack[i - ][j]];
for(int j = ; j <= stack[i][]; j++) vis[stack[i][j]] += o;
stack[i][] = ;
for(int j = ; j < ; j++) if(vis[j] > ) stack[i][++stack[i][]] = j;
}
putchar('{');
for(int i = ; i <= stack[k - ][]; i++) putchar(stack[k - ][i] + 'A');
putchar('}');
putchar('\n');
} int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_Judge
while(gets(buf) && buf[] != '\0') solve();
return ;
}
poj2269 Friends的更多相关文章
随机推荐
- Simple GDB case
to be added... gdb a.out [Inferior 1 (process 9718) exited with code 05] (gdb) list Line number ...
- 【转】线程、Thread类和线程终止
一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...
- Codeforce Round #220 Div2
这场气场太大,居然一个题不会! 所以没交! 赛后发现 A:陷阱多- -!不要超过上下界,可以上去再下来! B:不会做! C:自己想太多- -!
- CentOS 7 内核更新后删除旧内核
0.当前 # uname -sr Linux -.el7.x86_64 1.搜索查询 # rpm -q kernel kernel--.el7.x86_64 kernel--.el7.x86_64 k ...
- firefox中 checkbox属性checked="checked"已有,但复选框却不显示打钩的原因
最近在调试复选框的应用,在ie没有问题,考虑到兼容性,试试了firefox,遇到了问题. 复选框绑定了click事件,点一次选中,再点击取消选中,依次类推.这个功能在ie中没问题,但是在firefox ...
- linux centos5.7(32bit) oracle 10g oracle11g
cenOS5.5安装oracle10g(傻瓜篇) http://www.cnblogs.com/fnng/archive/2012/06/19/2554159.html (转) 在cenOS5.5上 ...
- PHP XDEBUG
PHP调试时,不得不提XDEBUG这个调试利器.学习PHP以来,几乎所有的问题我都利用它来解决. 首先关于如何安装,不在赘述,请自行google之.(需要特别注意的是:PHP5.2 和5.3 ,关于加 ...
- 夺命雷公狗ThinkPHP项目之----企业网站20之网站前台头尾分离
我们的网站直接让他头尾进行分离即可: 然后在代码里面找到id 为header的这段代码: 然后将整个div的内容都给弄出来,然后在view里面创建一个Public的目录,然后在创建一个header.h ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON DispCross
zw版[转发·台湾nvp系列Delphi例程]HALCON DispCross procedure TForm1.Button1Click(Sender: TObject);var r, c : Ol ...
- yii2获取登陆的用户名
yii2获取登陆的用户名: yii::$app->user->identity->username; 判断用户名是否登陆 if(Yii::$app->user->isGu ...