周赛FFFFFFFFFFFFFFF

小霾作为ACM工作室现役最强日语大师,有一套学习日语的绝活:记单词!

每当小霾打开一本有n个单词的日语书,他都会从头开始记单词,由于小霾虽然很强但并不是天才,他同一时间最多记住k个单词,每当看到小霾在记满k个单词的情况下遇到没记住的单词,小霾就会忘掉最先记住单词,来记新单词。由于这些日语书是园哥给的,上面可能包含了很多相同单词,每个单词都有一个编号。

请你告诉小霾他最后记住了几个单词,并把这些单词的编号输出。
 

Input

输入的第一行包含两个整数n和k(1≤n,k≤2e5)-日语书上的单词数和小霾同一时间最多记的单词种类数。
输入的第二行包含n个整数id1,id2,…,idn(1≤idi≤1e9),其中idi是日语书第i个单词的编号。

Output

在输出的第一行中,输出一个整数m(1≤m≤min(n,k))-表示最后小霾记住的单词数
在第二行中,输出m个整数ids1,ids2,…,idsm,其中idsi是小霾按照从后到先顺序记住的单词数。

Examples

Input

7 2
1 2 3 2 1 3 2

Output

2
2 1 

Input

10 4
2 3 3 1 1 2 1 2 3 3

Output

3
1 3 2 

Note

在第一个样例中,小霾记住的单词编号如下(从先记到后记的顺序):

[];
[1];
[2,1];
[3,2];
[3,2];
[1,3];
[1,3];
[2,1]。
在第二个示例中:

[];
[2];
[3,2];
[3,2];
[1,3,2];
然后到最后也不会改变。

 

模拟就好了

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define dbug cout<<"hear!"<> n >> k;
	queuesix;
	mapmp;
	while (n--)
	{
		ll x;
		cin >> x;
		if (mp[x] >= 1)
		{
			continue;
		}
		else {
			mp[x]++;
		}
		if (six.size() == k)
		{
			ll cnt = six.front();
			six.pop();
			mp[cnt] = 0;
			six.push(x);
		}
		else
		{
			six.push(x);
		}
		
	}
	ll cnt = six.size();
	cout << cnt << endl;
	ll ant = 0;
	while (!six.empty())
	{
		arr[ant] = six.front();
		six.pop();
		ant++;
	}
	for (ll i = ant - 1;i >= 0;i--)
	{
		cout << arr[i] << ' ';
	}
}

 

你可能感兴趣的:(c++,算法)