• Hash


    按照yyhdalao的话来说那就是看到什么学什么不用照着学,能学什么学什么。

    所以今天领悟了一下hash(自己打的并不是很规范的吧,我感觉

    找到A集合与B集合的关系由于集合中的数字过大所以要进行hash一下。

    首先尝试定义一个mod然后开始%,这样使较大的数字存到桶里进行调用。但是数字过大可能两个数字同时%掉这个数字的话就可能一样的了。

    这就是70分的原因,还有就是这道题没多少细节,水水就过去了。开始考虑怎么水过......

    map吧直接两个数字开始绑定,然后进行比较,好方法!于是水过了这道题。。

    #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iomanip>
    #include<ctime>
    #include<vector>
    #include<queue>
    #include<map>
    #include<stack>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=10000017;
    int n,m,x;
    int num=0,top=0;
    map<int,int>a;
    map<int,int>b;
    int c[maxn],d[maxn];
    int main()
    {
        n=read();for(int i=1;i<=n;i++)x=read(),a[x]=1,c[i]=x;
        m=read();for(int j=1;j<=m;j++)x=read(),b[x]=1,d[j]=x;
        if(n>m)
        {
            int flag=0,u=0;
            for(int i=1;i<=m;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("B is a proper subset of A
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n<m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(b[c[i]]!=1)flag=1;
                if(b[c[i]]==1)u=1;
            }
            if(flag==0)printf("A is a proper subset of B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n==m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("A equals B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        return 0;
    }

    可是时间虽然不超但是速度实在是太慢了,这个算法不优秀(尽管map足够优秀了

    然后继续hash啊,拉链法搞一波,其实就是开一个邻接表即可。。。简单

    #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iomanip>
    #include<ctime>
    #include<vector>
    #include<queue>
    #include<map>
    #include<stack>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=10000017;
    int n,m,x;
    int num=0,top=0;
    map<int,int>a;
    map<int,int>b;
    int c[maxn],d[maxn];
    int main()
    {
        n=read();for(int i=1;i<=n;i++)x=read(),a[x]=1,c[i]=x;
        m=read();for(int j=1;j<=m;j++)x=read(),b[x]=1,d[j]=x;
        if(n>m)
        {
            int flag=0,u=0;
            for(int i=1;i<=m;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("B is a proper subset of A
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n<m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(b[c[i]]!=1)flag=1;
                if(b[c[i]]==1)u=1;
            }
            if(flag==0)printf("A is a proper subset of B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        if(n==m)
        {
            int flag=0,u=0;
            for(int i=1;i<=n;i++)
            {
                if(a[d[i]]!=1)flag=1;
                if(a[d[i]]==1)u=1;
            }
            if(flag==0)printf("A equals B
    ");
            if(flag==1&&u==1)printf("I'm confused!");
            if(flag==1&&u==0)printf("A and B are disjoint");
        }
        return 0;
    }

    Perfectly AC!

    想喝水时,仿佛能喝下整个海洋似的——这是信仰;等到真的喝起来,一共也只能喝两杯罢了——这是科学。

                                                     ————  契柯夫

  • 相关阅读:
    C++逐行读取文本文件的正确做法
    <Android Framework 之路>Android5.1 Camera Framework(一)
    zeromq-4.1.2在windows下的编译
    Duilib应用修改程序图标方法
    gdal集成kml库的做法
    使用DWR实现JS调用服务端Java代码
    DirectUI界面编程(六)实现右键弹出菜单
    如何设计系统的错误码及错误信息
    TCP协议格式
    UDP协议
  • 原文地址:https://www.cnblogs.com/chdy/p/9989794.html
Copyright © 2020-2023  润新知