codeforces978a

A. Remove Duplicates

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Petya has an array aa consisting of nn integers. He wants to remove duplicate (equal) elements.

Petya wants to leave only the rightmost entry (occurrence) for each element of the array. The relative order of the remaining unique elements should not be changed.

Input

The first line contains a single integer nn (1≤n≤501≤n≤50) — the number of elements in Petya's array.

The following line contains a sequence a1,a2,…,ana1,a2,…,an (1≤ai≤10001≤ai≤1000) — the Petya's array.

Output

In the first line print integer xx — the number of elements which will be left in Petya's array after he removed the duplicates.

In the second line print xx integers separated with a space — Petya's array after he removed the duplicates. For each unique element only the rightmost entry should be left.

Examples

input

Copy

6
1 5 5 1 6 1

output

Copy

3
5 6 1 

input

Copy

5
2 4 2 4 4

output

Copy

2
2 4 

input

Copy

5
6 6 6 6 6

output

Copy

1
6 

Note

In the first example you should remove two integers 11, which are in the positions 11 and 44. Also you should remove the integer 55, which is in the position 22.

In the second example you should remove integer 22, which is in the position 11, and two integers 44, which are in the positions 22 and 44.

In the third example you should remove four integers 66, which are in the positions 11, 22, 33 and 44.

 

 

要求:去除重复数字后输出,如果是重复的元素则以最后一次出现的次序完成输出。

当时的思维定式是:一定要正序遍历。但是发生了两种情况:判断是否出现过利用visit[a[i]],记录非重复元素的个数,输出时候的次数和下标则没有必然关系。倘若再利用数组记录下标那么什么时候进行记录?是对已经出现过得元素进行下标的更新?

对于我来说,这么想越发抽象。

当我觉得这个思路走下去遇到矛盾的时候,很有可能原来的思路是有问题的。一定要退出来,重新构思。

队友利用倒叙的判断方法,使得正序的最后成为 倒叙的开端。这是我不曾利用==反面思维==想到的。

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

int main(){
	int n,t,k;
	int a[60];
	int c[60];
	int visit[1010];
	while(cin >>n){
		k = 0; 
		memset(a,0,sizeof(a));
		memset(c,0,sizeof(a));
		memset(visit,0,sizeof(visit));
		for(int i =0 ;i <n ;++i){
			cin >>a[i];
		}
		for(int i = n-1 ; i>=0 ;i--){
		//	cout <<"visit[a[i]]="<<visit[a[i]]<<endl;
			if(!visit[a[i]]){
				visit[a[i]] = 1; 
				c[k++] = a[i];//cout <<"a[i]= "<<a[i];
			}
			
		}
		
		cout  <<k <<endl;
		for(int i =k-1 ;i>=0 ;i--){
			if(i!=0){
				cout << c[i]<<" "; 
			}
			else{
				cout <<c[i];
			}
			
		}
		cout << endl; 
	}
	return 0;
}
//

提交上去两次没有过是因为没有注意 元素个数与和元素范围 ,因为这个决定数组开多大的问题。很粗心当时那么强烈的意识去顾及那个。最后一次是卡的边缘数据。当元素值正好是1000的时候。

昨晚做题的时候,看见队友们纷纷完成此题,不免慌乱。草草看着下题,仍是没有什么思路。每次回忆,就像是一个魔怔,胆颤不已。

差距是不会一下子消除的,我现在可以做的就是告诉自己,你可以通过努力消除明显的差距。

不要每一步都追求完美。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值