[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;}
posted @ 2020-07-20 08:46  unknown_future  阅读(31)  评论(0编辑  收藏  举报