首页 > 代码库 > HDU 1082
HDU 1082
http://acm.hdu.edu.cn/showproblem.php?pid=1082
这题开始想复杂了,error并不包括表达式本身不合法的情况
我的方法是遇到右括号就开始处理栈,如果开始最外层没有括号,就人为加上
数据应该是比较弱的,一通乱搞
#include <iostream>#include <cstdio>#include <cstring>#include <stack>using namespace std ;int n ;struct Mat{ int op ; int r,c ;}M[30000] ;Mat cc[1005] ;char s[10005],ss[10005] ;int main(){ scanf("%d",&n) ; for(int i=0 ;i<n ;i++) { char op[5] ; scanf("%s%d%d",op,&M[i].r,&M[i].c) ; M[i].op=op[0] ; } int tt=n ; while(~scanf("%s",s)) { n=tt ; int len=strlen(s) ; if(s[0]!=‘(‘) { for(int i=1 ;i<=len ;i++) ss[i]=s[i-1] ; ss[0]=‘(‘ ;ss[len+1]=‘)‘ ; len+=2 ; for(int i=0 ;i<len ;i++) s[i]=ss[i] ; } int flag=0 ; for(int i=0 ;i<len ;i++) { if(s[i]==‘(‘ || s[i]==‘)‘) { flag=1 ; break ; } } int ans=0 ; int ct=255 ; stack <int> st ; flag=1 ; for(int i=0 ;i<len ;i++) { if(s[i]!=‘)‘) { st.push(s[i]) ; } else { int cnt=0 ; while(1) { if(st.empty())break ; if(st.top()==‘(‘) { st.pop() ; break ; } int temp=st.top() ; st.pop() ; for(int j=0 ;j<n ;j++) { if(M[j].op==temp) { cc[cnt++]=M[j] ; break ; } } } for(int j=cnt-2 ;j>=0 ;j--) { if(cc[j+1].c==cc[j].r) { ans+=(cc[j+1].r*cc[j+1].c*cc[j].c) ; } else { flag=0 ; break ; } cc[j].r=cc[j+1].r ; } if(!flag)break ; cc[0].op=ct++ ; M[n++]=cc[0] ; st.push(cc[0].op) ; } if(!flag)break ; } if(flag)printf("%d\n",ans) ; else puts("error") ; } return 0 ;}
HDU 1082
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。