题目大意:
输入第一行表示总共的测试组数n。每一组中的第一行表示本组的数据个数m,而后m行每一行是一个数据名称,以栈的方式,先出现的在栈顶,后出现的在栈底
表示初始状态,再后m行也是每行一个数据名称,先出现的在栈顶,后出现的在栈底 ,表示目标状态
允许的操作:将栈中的某一个元素移至栈顶,并且其它元素相对位置不变
要求:求从初始状态到目标状态所需的最少操作
输出: 如果有多解任意一组都行,对于一组解依次输出每次移动元素的名称,且每个元素名称独占一行,每组数据(注意是每组数据都要如此)后都需要有一额外的空行。
算法:
1.给每个数据标号,即依照目标状态 , 从栈顶都栈底依次为0,1,...n-1
2.依照上面的标号,按从栈顶到栈底的顺序扫描一遍初始状态,寻找满足以下条件的最大标号k
即满足在扫描到它之前出现过比它标号大的元素。
3.依次输出标号为k , k-1 , ...0元素对应的名字。
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i = 0 ; i < n ; ++i)
{
int m;
cin >> m; getchar();
string str;
vector<string> v1 , v2;
for(int j = 0 ; j < m ; ++j)
{
getline(cin , str);
v1.push_back(str);
}
map< string , int > u;
for(int j = 0 ; j < m ; ++j)
{
getline(cin , str);
v2.push_back(str);
u.insert(make_pair(str , j));
}
int p = -1 , q = -1;
for(int j = 0 ; j < m ; ++j)
{
int t = u.find(v1[j])->second;
if(t>p) p = t;
else if(t > q) q = t;
}
for(int j = q ; j >= 0 ; --j)
cout << v2[j] << endl;
cout <<endl;
}
return 0;
}