[hash]集合
集合
题目描述
给定两个集合A、B,集合内的任一元素x满足1 ≤ x ≤ 109,并且每个集合的元素个数不大于105。我们希望求出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!”
输入
输入有两行,分别表示两个集合,每行的第一个整数为这个集合的元素个数(至少一个),然后紧跟着这个集合的元素(均为不同的正整数)
输出
只有一行,就是A、B的关系。
输入样例
样例1
2 55 27
2 55 27
样例2
3 9 24 1995
2 9 24
样例3
3 1 2 3
4 1 2 3 4
样例4
3 1 2 3
3 4 5 6
样例5
2 1 2
2 2 3
输出样例
样例1
A equals B
样例2
B is a proper subset of A
样例3
A is a proper subset of B
样例4
A and B are disjoint
样例5
I’m confused!
分析
这题就是有两个集合,要判断集合的关系
关系1:两个集合一样
关系2:A集合属于B集合
关系3:B集合属于A集合
关系4:两个集合没有一个相同
关系5:除了以上关系的其他关系
解题思路
hash的除余法加判断
code
#include<stdio.h>
#include<iostream>
using namespace std;
int dw(int x);
int hash(int x);
const int t=149997;
int a[t+666],sum,n1,n2,x;
int main(){
scanf("%d",&n1);
for(int i=1;i<=n1;++i) scanf("%d",&x),a[dw(x)]=x;
scanf("%d",&n2);
for(int i=1;i<=n2;++i) scanf("%d",&x),sum+=a[dw(x)]==x;
if(sum==n1 and n1==n2)printf("A equals B");else
if(sum==n2)printf("B is a proper subset of A");else
if(sum==n1)printf("A is a proper subset of B");else
if(!sum)printf("A and B are disjoint");
else printf("I'm confused!");
return 0;
}
int dw(int x){
int w=hash(x),i=0;
while(i<t and a[i+w%t] and a[i+w%t]!=x)++i;
return (w+i)%t;
}
int hash(int x){return x%t;}