UVa 496 Simply Subsets(STL&setcursection)
1544 ワード
http://uva.onlinejudge.org/index.php?option=com_オンラインjudge&Itemid=8&category=24&page=show_problem&problem=437
最初のファイルの集合演算に関する4つの関数を紹介します。
setユニオン
ユニオンof two sorted ranges
(集合:A∪B)
setインターセレクション
Intersection of two sorted ranges
(交差点:A∩B)
setディfference
ディfference of two sorted ranges
(差集:A-B)
setsymmetric_ディfference
Symmetric difference of two sorted ranges
(対称差分セット:A△B)
明らかに、ここでは二つの集合の関係を判断し、交差点を使って判断すればいいです。
使用方法:
関数の戻り値からv.begin()を引くと、セットのサイズです。
完全コード:
最初のファイルの集合演算に関する4つの関数を紹介します。
setユニオン
ユニオンof two sorted ranges
(集合:A∪B)
setインターセレクション
Intersection of two sorted ranges
(交差点:A∩B)
setディfference
ディfference of two sorted ranges
(差集:A-B)
setsymmetric_ディfference
Symmetric difference of two sorted ranges
(対称差分セット:A△B)
明らかに、ここでは二つの集合の関係を判断し、交差点を使って判断すればいいです。
使用方法:
set_intersection(a, a + n, b, b + m, v.begin());
ここでvは、演算結果を保存するための動的配列である。(他の関数の使い方は同じです。)関数の戻り値からv.begin()を引くと、セットのサイズです。
完全コード:
/*0.016s*/
#include
using namespace std;
int a[100], b[100];
vector v(100);///
int main()
{
int n, m, cnt, diff;
char ch;
while (~scanf("%d%c", &a[0], &ch))
{
for (n = 1; ch != 10; ++n)
scanf("%d%c", &a[n], &ch);
cnt = scanf("%d%c", &b[0], &ch);
for (m = 1; ch != 10 && cnt == 2; ++m)
cnt = scanf("%d%c", &b[m], &ch);
sort(a, a + n);
sort(b, b + m);
diff = set_intersection(a, a + n, b, b + m, v.begin()) - v.begin();
if (diff == min(n, m))
{
if (n < m) puts("A is a proper subset of B");
else if (n > m) puts("B is a proper subset of A");
else puts("A equals B");
}
else if (diff) puts("I'm confused!");
else puts("A and B are disjoint");
}
return 0;
}