//这个算法用到了“相对位置”的思想,并且就本题而言还有一个很重要的结论就是,假设
//移动了k个元素,那么这k个元素一定是最后结果的那个序列的前k个元素,而且易知,
//越先移动的元素一定会越被压在移动的元素的底部
首先找到需要移动的字符串,方法如下:以初始序列为准,设初始序列下标为i, 目的序列下标为j, 从n-1开始,如果两下标对应的字符串相等,下标同时减一,否则仅初始序列下标减一。那么目的序列中还未被成功匹配的字符串就是需要移动的字符串。要使移动次数最少,显然应该按未被处理的目的序列中字符串逆序移动(输出)。
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> using namespace std; const int N=210; char orginal[N][100]; char required[N][100]; int main() { int T; scanf("%d", &T); getchar(); while(T--) { int n, i, j; scanf("%d", &n); getchar();//忽略换行,不然gets会返还空串 for(i=0; i<n;i++) { gets(orginal[i]); } for(i=0; i<n;i++) { gets(required[i]); } for(i=j=n-1; i>=0;i--) { if(!strcmp(orginal[i], required[j])) j--; } for(;j>=0;j--) puts(required[j]); printf(" "); } return 0; }