按键排序并去重

C++ Hard sorting

任务 «按键排序并去重»

给定一个整数数组。需要将其按升序排序,并删除所有重复值,但有一个条件:如果某个数字出现超过一次,那么在删除重复项后,它在排序数组中的序号(从零开始的索引)必须等于它在原始数组中出现的次数减一。换句话说,对于每个唯一值 x,它在原始数组中出现 k 次,那么在结果数组中应恰好有一个 x,且其索引应为 k-1。如果对于某个 x 无法满足此条件(例如,索引超出数组范围或已被其他数字占用),则该 x 不包含在结果中。保证所有需要包含的数字都能满足该条件。输出最终按升序排序的数组。

输入格式

第一行:整数 n (1 ≤ n ≤ 10^5) — 元素数量。第二行:n 个整数,绝对值不超过 10^9,以空格分隔。

输出格式

在第一行输出整数 m —— 最终数组中的元素个数。在第二行按升序输出 m 个整数。

示例

示例 1

输入
6 3 1 2 2 3 1
输出
1 3

示例 2

输入
5 5 5 5 5 5
输出
1 5

示例 3

输入
5 Математика Иванов 101 2 3 Физика Петров 202 3 2 Математика Иванов 101 2 3 Химия Сидоров 303 4 1 Физика Петров 202 3 2
输出
3 Математика Иванов 101 2 3 Физика Петров 202 3 2 Химия Сидоров 303 4 1

示例 4

输入
7 4 2 4 2 4 2 4
输出
2 2 4

示例 5

输入
3 Алгебра Смирнов 105 1 1 Алгебра Смирнов 105 1 1 Геометрия Смирнов 105 1 2
输出
2 Алгебра Смирнов 105 1 1 Геометрия Смирнов 105 1 2
main.cpp