給定 n 個長度為 3 的子串(可能重複),它們是某長度為 n+2 字符串的所有連續三元子串。求還原出任意一個符合條件的原字符串,或判斷無解。
in == out(歐拉回路),要么恰有兩個節點 out = in + 1(起點)和 in = out + 1(終點),其餘 in == out。void dfs(int u) {
for (int &i = head[u]; i != -1; i = edges[i].next) {
if (used[i]) continue;
used[i] = true;
dfs(edges[i].to);
}
path.push_back(u); // 回溯時記錄節點
}
head[u] 指向第一條邊。head[u] 跳過已用邊,避免重複遍歷。路徑節點序列 v0, v1, ..., vk (k = n+1)。每個節點代表兩字符。原串 = v0 的完整兩字符 + v1 最後一字符 + ... + vk 最後一字符。
62*62 = 3844。n ≤ 2e5,需靜態數組存儲。經典「子串還原字符串」問題,建模為有向圖歐拉路徑。關鍵步驟:節點定義(長度-1 子串)、邊定義(長度 子串)、度數條件判斷、Hierholzer 算法構造路徑、路徑轉字符串。