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