• 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
    ",ans) ;
            else puts("error") ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    [solution]xdebug正确配置,但不显示错误信息
    SIGCHLD信号
    sigsuspend
    信号引起的竞态
    智力面试题
    可重入和不可重入
    信号—信号处理函数(捕捉)
    PCB信号集
    信号产生的原因:
    信号初步
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/4042528.html
Copyright © 2020-2023  润新知