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\n");
        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\n");
        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\n");
        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\n");
        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\n");
        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\n");
        if(flag==1&&u==1)printf("I'm confused!");
        if(flag==1&&u==0)printf("A and B are disjoint");
    }
    return 0;
}

Perfectly AC!

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

                                                 ————  契柯夫

posted @ 2018-11-20 16:35  chdy  阅读(166)  评论(0编辑  收藏  举报