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;
}

 

 

转载于:https://www.cnblogs.com/xchaos/archive/2012/06/11/2545039.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值