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<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
bool visited[1000001];
int main()
{
int C, N;
while(cin >> C >> N)
{
vector<int> 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<int> 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;
}