sicily--1351. Multi-key Sorting

1.一开始真的觉得很难很难,因为刚刚做了一个 KMP 的题目,个人觉得这个题目是不是在考察同样的东西,就是说如果两个连续的“区间”(1、2、3***个数字为一个区间)如果相同则可以舍去一个区间,这样我就一直在想可不可以往KMP上面去靠,但是怎么都不行

2.后来一想,题目所说的是 "stable" ,那么无论即使前面的排序如何,只要后面的有另一个列的排序的话,那么前面的列顺序可以说就被破坏了,这么一说,就是只要最后“一次”排序才是有效的,每一个列的排序都确定了自己的列, 所以我们只需要在输入的排序顺序从后往前扫描,只存取不一样的sort(k),即每个列只需1次即可

列子:

初始:
列1	列2
c	a
c	b
b	a
a	c

排序序列:1、2、1
经过1后:		经过2后:		经过1后:
列1	列2		列1	列2		列1	列2
a	c		b	a		a	c
b	a		c	a		b	a
c	a		c	b		c	a	
c	b		a	c		c	b

排序序列:2、1
经过2后:		经过1后:
列1	列2		列1	列2
c	a		a	c
b	a		b	a
c	b		c	a	
a	c		c	b
最后结果是一致的!

程序代码;

#include
#include
#include
#include
#include
using namespace std;

bool visited[1000001];
int main()
{
	int C, N;
	while(cin >> C >> N)
	{
		vector sequence;
		int pre = 0, now = 0;
		for(int i = 0; i < N; i++)
		{
			scanf("%d", &now);
			if(pre == now)//连续两个相同
				continue;
			else
			{
				pre = now;
				sequence.push_back(now);
			}
		}
		memset(visited, false, sizeof(visited));
		stack min;
		for(int i = sequence.size() - 1; i >= 0; i--)
		{
			if(!visited[sequence[i]])
			{
				min.push(sequence[i]);
				visited[sequence[i]] = true;
			}
		}

		//cout << min.size() << endl;
		printf("%d\n", min.size());
		while(!min.empty())
		{
			//cout << min.top();
			printf("%d", min.top());
			min.pop();
			if(min.empty())
				;
			else
				//cout << " ";
				printf(" ");
		}
		//cout << endl;
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(Sicily,sorting,c)