hash 表 | | jzoj 1335 | | 脑残+手残 | | 集合的关系

给定两个集合A、B,集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5。我们希望求出A、B之间的关系。

给定两个集合的描述,判断它们满足下列关系的哪一种:
A是B的一个真子集,输出“A is a proper subset of B”
B是A的一个真子集,输出“B is a proper subset of A”
A和B是同一个集合,输出“A equals B”
A和B的交集为空,输出“A and B are disjoint”
上述情况都不是,输出“I‘m confused!”

***************************************************************

哈希表的线性探测法,比较ab数组项数多少,然后对a(b)数组进行插入,b(a)数组进行查找,flag用于查询即可

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<ctime>
using namespace std;
const int maxprime=1000003;
const int step=7;
const int N=1000000;
struct nums
{
    int val,sum;
}hash[N];
int m,n;
int find(int x)
{
    int temp=x%maxprime;
    while(hash[temp].val!=0&&hash[temp].val!=x)
    {
        temp+=step;
        if(temp>=maxprime)  temp-=maxprime;
    }
    return temp;
}
bool flag1=0,flag2=0;
void  insert(int x)
{
    int now=find(x);
    hash[now].val=x;
    return ;
}
void judge(int x)
{
    int now=find(x);
    if(hash[now].val==x)    flag1=1;
    else    flag2=1;
}
int a[N],b[N];
int main()
{
    //freopen("a.in","r",stdin);
   //freopen("a.out","w",stdout);
    int i=1;
    ios::sync_with_stdio(false);
    cin>>m;
    for(int i=1;i<=m;i++)
        cin>>a[i];
    cin>>n;
    for(int j=1;j<=n;j++)
        cin>>b[j];
    if(m<n)
    {
        for(int i=1;i<=n;i++)
           insert(b[i]);
        for(int i=1;i<=m;i++)
            judge(a[i]);
        if(flag1==1&&flag2==0)  {cout<<"A is a proper subset of B"<<endl; /*cout<<"THE TIME HAS PASSED: "<<clock()<<" ms"<<endl;*/return 0;}
        if(flag1==0&&flag2==1)  {cout<<"A and B are disjoint"<<endl; /*cout<<"THE TIME HAS PASSED: "<<clock()<<" ms"<<endl;*/return 0;}
    }
    if(m>n)
    {
        for(int j=1;j<=m;j++)
            insert(a[j]);
        for(int i=1;i<=n;i++)
            judge(b[i]);
        if(flag1==1&&flag2==0)  {cout<<"B is a proper subset of A"<<endl; /*cout<<"THE TIME HAS PASSED: "<<clock()<<" ms"<<endl;*/return 0;}
        if(flag1==0&&flag2==1)  {cout<<"A and B are disjoint"<<endl; /*cout<<"THE TIME HAS PASSED: "<<clock()<<" ms"<<endl;*/return 0;}
    }
    if(m==n)
    {
        for(int i=1;i<=m;i++)
            insert(a[i]);
        for(int j=1;j<=n;j++)
            judge(b[j]);
        if(flag1==1&&flag2==1)  {cout<<"A equals B"<<endl;return 0;}
        if(flag1==0&&flag2==1)  {cout<<"A and B are disjoint"<<endl; /*cout<<"THE TIME HAS PASSED: "<<clock()<<" ms"<<endl;*/return 0;}
    }
    cout<<"I‘m confused!"<<endl;
     /*cout<<"THE TIME HAS PASSED: "<<clock()<<" ms"<<endl;*/
    return 0;

}
时间: 2024-10-29 19:12:04

hash 表 | | jzoj 1335 | | 脑残+手残 | | 集合的关系的相关文章

HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)

根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 const int N = 1000000 + 10; 6 const int HASH = 1000000 + 7; 7 typedef long long ll; 8 struct hashmap

ajax 和bootstrap混用手残出现的一个bug

前端是这样的 原本的逻辑是点击提交之后,出现模态框,然后点击评论之后用ajax把数据提交给后端,看起来没问题,但是手残把两个按钮嵌套一起了, (代码并不完整) 错误的代码 $("#回复按钮").on('click', function(){     //获得回复对象的信息;     $("模态框中的评论").on('click' function(){         //获得弹出框中的绰号和内容         .ajax({             传输数据;

Hash表的表大小

hash表的出现主要是为了对内存中数据的快速.随机的访问.它主要有三个关键点:Hash表的大小.Hash函数.冲突的解决. 这里首先谈谈第一点:Hash表的大小. Hash表的大小一般是定长的,如果太大,则浪费空间,如果太小,冲突发生的概率变大,体现不出效率.所以,选择合适的Hash表的大小是Hash表性能的关键. 对于Hash表大小的选择通常会考虑两点: 第一,确保Hash表的大小是一个素数.常识告诉我们,当除以一个素数时,会产生最分散的余数,可能最糟糕的除法是除以2的倍数,因为这只会屏蔽被除

南阳OJ-138 找球号(二)(hash表应用)

找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY",表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分

python 字典有序无序及查找效率,hash表

刚学python的时候认为字典是无序,通过多次插入,如di = {}, 多次di['testkey']='testvalue' 这样测试来证明无序的.后来接触到了字典查找效率这个东西,查了一下,原来字典在python内部是通过哈希表的顺序来排的,做了一些测试,比如di = {1:1,3:3,2:2,4:4,5:5} ,无论怎么改变键值对的顺序,print di 总是会{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}.所以看起来当插入di['key']='value'时,这组键值对有时

hash表总结

Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组.链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找.这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找. 1.Hash表的设计思想 对于一般的线性表,比如链表,如果要存储联系人信息: 张三 13980593357 李四 15828662334 王五 13409821234 张

hdu 5183 hash表

BC # 32 1002 题意:给出一个数组 a 和一个数 K ,问是否存在数对( i , j ),使 a i   - a i + 1 +……+ (-1)j - i  a j : 对于这道题,一开始就想到了是前缀和,但是如果只是记录下前缀和数组,那么查找就会成为一个大问题.补题的时候一开始考虑用 hash 数组或者是 set 存,但是很明显 TLE 了,在翔神的推荐下,我研究了一下 hash表的创建过程,惊奇地发现,其实就是建了一个 HashMap 结构体,而里面放了这个表所用的数组以及相应操作

nyist oj 138 找球号(二)(hash 表+位运算)

找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i<=100000000),编号可重复,还有一个空箱子,现在有两种动作:一种是"ADD",表示向空箱子里放m(0<m<=100)个球,另一种是"QUERY",表示说出M(0<M<=100)个随机整数ki(0<=ki<=100000100),分

数据结构与算法-hash表

前言 哈希表是一种存放键-值对的数据结构,其中值用来存放我们真正需要的数据,键的主要目的就是为了找到值.哈希表理想情况下,只需要一次hash计算即可找到值数据,但通常情况下我们不需要耗费巨大的额外空间来追求这丝毫的查找速度(要追求低hash冲突率,必然要扩大hash表),我们更希望的是让空间和时间达到某种平衡,这可以通过调节hash函数来解决(装填因子). 装填因子=表中的记录数/哈希表的长度,如果装填因子越小,表明表中还有很多的空单元,则发生冲突的可能性越小:而装填因子越大,则发生冲突的可能性