集合(normal) Time Limit:2000MS Memory Limit:65536K Total Submit:563 Accepted:182
Description
给定两个集合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!”
Input
输入有两行,分别表示两个集合,每行的第一个整数为这个集合的元素个数(至少一个),然后紧跟着这个集合的元素(均为不同的正整数)
Output
只有一行,就是A、B的关系。
Sample Input
样例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
Sample Output
样例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!
//思路:很简单经典普通的hash,自己看吧,都可以作为模板了……
const max=1580089;//开大一点,不然效率会很低 var f:array[0..max] of longint; a:array[0..1200000]of longint; ans,an,bn,j:longint; function locate(x:longint):longint; var i:longint; begin i:=x mod max; while (f[i]<>0)and(f[i]<>x)do inc(i);//确定位置存放f[-] f[i]:=x; end; procedure ok(x:longint); var i:longint; begin i:=x mod max; while (f[i]<>0)and(f[i]<>x) do i:=i+1;//寻找f[-] if f[i]=x then inc(ans);//判断啦,根据题意 end; begin read(an); for j:=1 to an do begin read(a[j]); locate(a[j]); end; read(bn); for j:=1 to bn do begin read(a[j]); ok(a[j]);//我的想法是存入一个数组,另一个用来比较 end; if (an=bn)and(ans=an)and(ans=bn)then write('A equals B')else//利用an,bn的长度和ans的大小可以直接判断 if (an<bn)and(ans=an)then write('A is a proper subset of B')else if (an>bn)and(ans=bn)then write('B is a proper subset of A')else if (ans=0) then write('A and B are disjoint') else write('I''m confused!');//记得打'!!!! end.