题目
分析
- 标题党,与
希尔排序
无关; - 给出两组
龟壳
,一组初始序列,一组目标序列。要求对初始序列排序,达到目标序列,排序规则要求一次仅能把某龟壳
移至顶部。依次输出移动的龟壳
的名字。
思路
逆向思考,如何把目标序列滚回初始序列,举一个栗子。
Y R S D E M Z F W -> Y D S E M R Z F W
(Y) (R) (S) D E M Z F W -> () D () E M () Z F W
S -> ^ E
R -> ^ Z
Y -> ^ D也就是说,先用目标序列在初始序列找到相对位置最长的子串(即目标序列两个字符间可以插入非匹配字符),目标序列剩下未匹配的字符即是初始序列需要移动的字符。
代码
#include <cstdio>
#include <cstring>
int main()
{
int k, n, i, j;
char a[205][85], b[205][85];
scanf("%d\n", &k);
while (k--) {
scanf("%d\n", &n);
for (i = 0; i < n; i++) fgets(a[i], 85, stdin);
for (i = 0; i < n; i++) fgets(b[i], 85, stdin);
for (i = j = n-1; i >= 0; i--) if (strcmp(b[j], a[i]) == 0) j--;
for (; j >= 0; j--) printf("%s", b[j]);
printf("\n");
}
return 0;
}