給定初始烏龜堆疊順序(從頂到期)和目標順序。每次操作:選一隻烏龜爬到頂部。求最短操作序列將初始變為目標。
從目標順序自底向上檢查:
初始: Yertle, Duke, Lancelot (頂→底) 目標: Duke, Yertle, Lancelot 目標逆序: Lancelot, Yertle, Duke 初始逆序: Lancelot, Duke, Yertle 匹配: Lancelot ✓ (指針後移) Yertle ✗ (初始下一個是 Duke) Duke ✗ 未匹配: Yertle, Duke → 按目標順序輸出: Duke, Yertle
#include
#include
#include
#include
using namespace std;
int main() {
int T, n;
string s;
cin >> T;
while (T--) {
cin >> n; getchar(); // 吸收換行
vector init(n), target(n);
for (int i = 0; i < n; i++) getline(cin, init[i]);
for (int i = 0; i < n; i++) getline(cin, target[i]);
int j = n - 1;
for (int i = n - 1; i >= 0; i--) {
if (target[j] == init[i]) j--;
}
while (j >= 0) {
cout << target[j--] << '\n';
}
cout << '\n';
}
return 0;
}
| 指標 | 複雜度 |
|---|---|
| 時間 | O(n) 單次掃描 |
| 空間 | O(n) 存儲字符串 |
| 字符串比較 | O(L) L≤80,可視為常數 |
getline 讀整行cin >> n 後需 getchar() 吸收換行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 Output: Duke of Earl Sir Lancelot Richard M. Nixon Yertle
看似複雜的排序問題,實則是最長公共後綴子序列的變體。逆向思維(從目標底部看)+ 貪心匹配 即得最優解。代碼極短,核心邏輯僅 5 行,是算法競賽中「洞察力 > 代碼量」的經典案例。