他让每只乌龟都站在另一只乌龟的背上,然后把它们堆成九只乌龟的一堆。然后耶特尔爬了上去。他坐在桩上。多美的景色啊!他能看到“最多一英里!
耶特尔国王希望重新安排他的乌龟王位,使他最高级的贵族和最亲密的顾问更接近上层。一个单一的操作可以改变龟在堆栈中的顺序:一只龟可以爬出它在堆栈中的位置,爬到其他龟的上方坐在上面。给定海龟堆栈的原始顺序和同一海龟堆栈的必需顺序,您的工作是确定将原始堆栈重新排列到所需堆栈的最小操作序列。
输入
输入的第一行由一个整数k组成,给出测试用例的数量。每个测试用例都包含一个整数n,给出堆栈中海龟的数量。接下来的n行指定海龟堆栈的原始顺序。每一行都包含一只乌龟的名字,从栈顶的乌龟开始,一直到栈底的乌龟。海龟有独特的名字,每个名字都是由字母数字字符、空格字符和句号(“.”)组成的字符集中不超过80个字符组成的字符串。输入中接下来的n行给出了所需的堆栈顺序,再次从上到下命名海龟。每个测试用例总共由2n+1行组成。海龟数量(n)将小于或等于200只。
输出
对于每个测试用例,输出由一系列海龟名称组成,每行一个,指示海龟离开它们在堆栈中的位置并爬到顶部的顺序。此操作序列应将原始堆栈转换为所需的堆栈,并且应尽可能短。如果可能有多个最短长度的解,则可以报告其中任何一个解。在每个测试用例后打印一个空白行。
Sample Input
2
3
Yertle
Duke of Earl
Sir Lancelot
Duke of Earl
Yertle
Sir Lancelot
9
Yertle
Duke of Earl
Sir Lancelot
Elizabeth Windsor
Michael Eisner
Richard M. Nixon
Mr. Rogers
Ford Perfect
Mack
Yertle
Richard M. Nixon
Sir Lancelot
Duke of Earl
Elizabeth Windsor
Michael Eisner
Mr. Rogers
Ford Perfect
Mack
Sample Output
Duke of Earl
Sir Lancelot
Richard M. Nixon
Yertle
Sample Output
Duke of Earl
Sir Lancelot
Richard M. Nixon
Yertle
这个题目的英文真是头大,就是先给出一队的序列,在给出一队序列,序列中是乌龟的名字,要将第一队的顺序变为第二队,乌龟可以从他当前的位置爬到最顶端(只能是最顶端,不能是其他位置,可能看英文没有理解好题意)。要求输出那几个乌龟上爬了,并且也要按照先后顺序(谁先爬的,谁后爬的)。这个有点 Stack 的意思,先进后出,谁上爬了就会在 Stack 的栈顶附近(这道题目是从下往上爬)。怎么用栈来解释这道题目呢?就先看这个题目的意思吧,就是将一些乌龟从地下搬到最顶上,原来乌龟位置就会来一个新的乌龟(移动乌龟 的上一个乌龟就会下来),所以说,这几个被移动的乌龟被拿到上面去,其他乌龟占用他们的位置,我们就可以从后往前(从底下的乌龟往上匹配),相同乌龟就不用管,两个乌龟不同,说明有乌龟被移走了,就继续匹配原序列的乌龟(两个序列匹配都是从下往上匹配的),直到将原序列都匹配一遍后,这时占中,还有没有乌龟,就是被移走的乌龟。
上面说的是乌龟的顺序(从底往上),到达栈中就是从栈顶到栈底。
最后输出被移动的乌龟时,就是出栈的顺序。
include<iostream>
using namespace std;
#include<bits/stdc++.h>
const int maxn=10005;
typedef long long ll;
int main()
{
int i,j;
int t;
cin>>t;
while(t--)
{
stack<string>mp;
string s[maxn];
int n;
cin>>n;
getchar();
string name;
for(i=0;i<2*n;i++)
{
getline(cin,name);
if(i<n)
s[i]=name;
else
mp.push(name);
}
i=n-1;
while(!mp.empty()&&i>=0)
{
if(s[i]==mp.top())
mp.pop();
i--;
}
while(!mp.empty())
{
cout<<mp.top()<<endl;
mp.pop();
}
cout<<endl;
}
return 0;
}
好妙。