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 ;

}
View Code

 

你可能感兴趣的:(HDU)