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 ; }