首页 > 代码库 > 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 ;}
View Code

 

HDU 1082