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.

原文地址:https://www.cnblogs.com/qeatzy/p/4716217.html