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)
明らかに、ここでは二つの集合の関係を判断し、交差点を使って判断すればいいです。
使用方法:
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;
}