• hdu 1082, stack emulation, and how to remove redundancy 分类: hdoj 2015-07-16 02:24 86人阅读 评论(0) 收藏


    1. use fgets, and remove the potential ‘ ’ in the string’s last postion.
    2. (main point) remove redundancy
      there must be a stack, at first sight, you need a stack of type myNode, but think deeper, matrix multiplication is valid only if A.c=B.r, then the num of elementary multiplication is A.r*A.c*B.c, note that since A.c=B.r for every contiguous pair of matrices, so we can store the first matrix’s r and c, and for the rest, we first check validation, if error, break, else just store B.c, the B.r is not to been stored, thus remove redundancy.
      //
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    #define MAXSIZE 1000
    struct myNode{ int r,c; };
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif
        int n,i,ch,len,iserror,res, stk[MAXSIZE];
        char buf[MAXSIZE], *p;
        myNode matrices[26], *mat=matrices-'A';
        scanf("%d
    ",&n);
        if(n<=0) return -1;
        for(i=0;i<n;++i) {
            ch=getchar();
            scanf("%d%d
    ",&mat[ch].r,&mat[ch].c);
        }
        while(fgets(buf,MAXSIZE,stdin)) {
            len=strlen(buf);
            if(buf[len-1]='
    ') buf[--len]=0;
            for(res=0,iserror=0, p=buf+1;*p!=0 && *p=='(';++p) {}
            if(*p!=0) {
                stk[0]=mat[*p].r, stk[1]=mat[*p].c;
                for(len=1, ++p;*p!=0;++p) {
                    if(*p=='(') continue;
                    else if(*p==')') {
                        --len;
                        res+=stk[len-1]*stk[len]*stk[len+1];
                        stk[len]=stk[len+1];
                    }
                    else {
                        if(mat[*p].r!=stk[len]) { iserror=1; break; }
                        stk[++len]=mat[*p].c;
                    }
                }
                while(len>1) {
                    --len;
                    res+=stk[len-1]*stk[len]*stk[len+1];
                    stk[len]=stk[len+1];
                }
            }
            if(iserror) puts("error");
            else printf("%d
    ",res);
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。// p.s. If in any way improment can be achieved, better performance or whatever, it will be well-appreciated to let me know, thanks in advance.

  • 相关阅读:
    memset函数具体说明
    几种常见模式识别算法整理和总结
    GridView编辑删除操作
    Linux的文件夹配置
    Js apply 方法 具体解释
    深入分析C++引用
    Sizzle.selectors.relative [ 源代码分析 ]
    中文分词国内现状
    [数字图像处理]图像去噪初步(2)--非线性滤波器
    线程间共享数据的一个样例
  • 原文地址:https://www.cnblogs.com/qeatzy/p/4716217.html
Copyright © 2020-2023  润新知