同 Codeforces 508D,給定 n 個三字符子串,還原長度 n+2 的原字符串。每個子串對應一條從前兩字符到後兩字符的有向邊,求歐拉路徑。
id = c1*62 + c2 (共 3844 個節點)。s[0..2],加邊 id(s[0],s[1]) → id(s[1],s[2]),記錄邊對應的子串索引。out、入度 in。必須滿足:所有節點 |out-in| ≤ 1,且 out-in=1 的節點數 = in-out=1 的節點數 ∈ {0,1}。out=in+1 節點則為其,否則任意有邊節點)出發,DFS 遍歷所有邊,回溯時記錄節點。路徑逆序即為歐拉路徑。n+1 個節點(對應 n 條邊),否則無解。struct Edge { int to, nxt, id; } E[MAXE];
int head[MAXV], ecnt;
void addEdge(int u, int v, int id) { E[ecnt] = {v, head[u], id}; head[u] = ecnt++; }
vector path;
void dfs(int u) {
for (int &i = head[u]; i != -1; i = E[i].nxt) {
if (vis[i]) continue;
vis[i] = 1;
dfs(E[i].to);
}
path.push_back(u);
}
id,vis 標記邊而非節點。本題是歐拉路徑在字符串重構中的標準應用。掌握「子串→邊、重疊→節點」的建模技巧,並熟練實現 Hierholzer 算法(遞歸或棧模擬)是關鍵。