zoukankan      html  css  js  c++  java
  • POJ 3121 The SetStack Computer

    标程TLE。。。

    搜了下解题报告,用Hash做。

    把ELFHash的char*str换成了int*a.

    用pool来保存所出现过的集合.

     低级错误:把临时数据a赋给table.a, 第二天才发现

      

    #include<cstdio>
    #include<cstring>
    #include<ctime>
    #define MAX_HASH_SIZE 100000
    #define MAX_ENTRY_SIZE 5000
    #define MAX_DATA 4000000
    using namespace std;
    
    struct Entry
    {
        int *a,len;
    }e[MAX_ENTRY_SIZE];
    
    struct LNode
    {
        int id;
        LNode *next;
    };
    
    int m,n,s[MAX_ENTRY_SIZE],pool[MAX_DATA];
    LNode *hashList[MAX_HASH_SIZE];
    
    bool Cmp(int *a,int la,int *b,int lb)
    {
        int i;
        if(la!=lb)
            return 1;
        for(i=0;i<la;i++)
            if(a[i]!=b[i])
                return 1;
        return 0;
    }
    
    int ELFHash(int *a,int len)
    {
        unsigned int h=0;
        for(;len--;)
        {
            h=(h<<4 + *a);
            a++;
            unsigned int g=h&0xf0000000;
            if(g)
                h^=g>>24;
            h&=~g;
        }
        return h%MAX_HASH_SIZE;    
    }
    
    int ID(int *a, int len)
    {
        int i=ELFHash(a,len);
        LNode *p;
        for(p=hashList[i];p;p=p->next)
            if(Cmp(a,len,e[p->id].a,e[p->id].len)==0)
                return p->id;
        p=new LNode();
        p->next=hashList[i];
        p->id=n;
        hashList[i]=p;
        e[n].a=pool+m;
        e[n].len=len;
        for(;len--;m++,a++)
            pool[m]=*a;
        n++;
        return n-1;
    }
    
    int main()
    {
        //freopen("setstack.in","r",stdin);
        //freopen("out.txt","w",stdout);
        int T,m,top,*q,i,j,k,id,z[MAX_ENTRY_SIZE];
        char cmd[11],op;
        for(scanf("%d",&T);T--;)
        {
            memset(hashList,0,sizeof(hashList));
            n=top=m=0;
            for(scanf("%d",&m);m--;)
            {
                scanf("%s",cmd);
                op=cmd[0];
                if(op=='P')
                    s[top++]=ID(NULL,0);
                else if(op=='D')
                    s[top]=s[top-1],top++;
                else
                {
                    int x=s[--top];
                    int y=s[--top];
                    if(op=='U')
                    {
                        for(k=i=j=0;i<e[x].len&&j<e[y].len;k++)
                            if(e[x].a[i]<e[y].a[j])
                                z[k]=e[x].a[i++];
                            else if(e[x].a[i]>e[y].a[j])
                                z[k]=e[y].a[j++];
                            else
                                z[k]=e[y].a[j++],i++;
                        for(;i<e[x].len;)
                            z[k++]=e[x].a[i++];
                        for(;j<e[y].len;)
                            z[k++]=e[y].a[j++];
                    }
                    else if(op=='I')
                    {
                        for(k=i=j=0;i<e[x].len&&j<e[y].len;)
                            if(e[x].a[i]<e[y].a[j])
                                i++;
                            else if(e[x].a[i]>e[y].a[j])
                                j++;
                            else
                                z[k++]=e[x].a[i++],j++;
                    }
                    else
                    {            
                        for(i=0;i<e[y].len;i++)
                        {
                            z[i]=e[y].a[i];
                            if(z[i]==x)
                                x=-1;
                        }
                        k=e[y].len;
                        if(x>=0)
                        {
                            k++;
                            for(i--;i>=0&&z[i]>x;i--)
                                z[i+1]=z[i];
                            z[i+1]=x;
                        }    
                    }
                    s[top++]=ID(z,k);    
                }
                printf("%d\n",e[s[top-1]].len);
            }
            puts("***");
        }
        //printf("%.4lfs\n",clock()/(double)CLK_TCK);
    
        return 0;
    }
  • 相关阅读:
    SqlServer:创建索引
    SqlServer:使用视图 View
    SqlServer:修改和删除数据
    网络管理:SNMPv1
    《剑指 Offer》学习记录:题 9:用两个栈实现队列
    《剑指 Offer》学习记录:题 27:二叉树的镜像
    团队冲刺9
    团队冲刺8
    团队冲刺7
    团队冲刺6
  • 原文地址:https://www.cnblogs.com/xchaos/p/2545039.html
Copyright © 2011-2022 走看看