公式

C - Compression 解説 by sounansya


この問題は set と呼ばれるデータ構造を使うことで解くことができます。

set はいくつかの要素の集合を保持するデータ構造です。特徴として、配列は要素の順番を保持しますが set は数学の集合と同じように順番や各要素の個数を区別しません。

この問題は \(A\) の要素を全て set に代入し、set の中に残った要素を小さい順に並べることで正答することができます。

実装例(Python3)

n = int(input())
a = list(map(int, input().split()))
s = set(a)
ans = list(s)
ans.sort()
print(len(ans))
print(*ans)

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin >> n;
	vector<int> a(n);
	for (int &i : a)
		cin >> i;
	set<int> s(a.begin(), a.end());
	vector<int> ans(s.begin(), s.end());
	sort(ans.begin(), ans.end());
	cout << ans.size() << endl;
	for (int i = 0; i < ans.size(); i++)
		cout << ans[i] << " \n"[i + 1 == ans.size()];
}

また、 C++ には std::unique という関数が存在し、この関数を使うと楽に実装することができます。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin >> n;
	vector<int> a(n);
	for (int &i : a)
		cin >> i;
	sort(a.begin(), a.end());
	a.erase(unique(a.begin(), a.end()), a.end());
	cout << a.size() << endl;
	for (int i = 0; i < a.size(); i++)
		cout << a[i] << " \n"[i + 1 == a.size()];
}

投稿日時:
最終更新: