调不动了
并查集判联通+排序+欧拉回路
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
#define ft front()
#define bk back()
int n = 26, N, m, S, u, v, ind[30], oud[30], fa[30], cnt, cnt0;
vector<pii> G[30];
stack<int> ans;
string a[1003];
int find(int u) {
return fa[u] == u ? u : fa[u] = find(fa[u]);
}
bool cmp(pii x, pii y) {
return a[x.se] > a[y.se];
}
int gid(char x) {
return x - 'a' + 1;
}
void dfs(int w) {
int u = gid(a[w].bk), v;
while (G[u].size()) {
v = G[u].back().se;
G[u].pop_back();
if (v == S) continue;
dfs(v);
} ans.push(w);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> m;
for (int i = 1; i <= m; ++i) {
cin >> a[i], u = gid(a[i].ft), v = gid(a[i].bk);
if (!fa[u]) fa[u] = u, ++N;
if (!fa[v]) fa[v] = v, ++N;
G[u].emplace_back(v, i);
++oud[u], ++ind[v];
u = find(u), v = find(v);
if (u != v) fa[v] = u, ++cnt;
}
if (cnt < N - 1) {
cout << "***";
return 0;
} cnt = 0;
for (int i = 1; i <= n; ++i) {
if (ind[i] + 1 == oud[i]) ++cnt;
else if (oud[i] + 1 == ind[i]) ++cnt0;
sort(G[i].begin(), G[i].end(), cmp);
}
if (cnt == 1 && cnt0 == 1) {
for (S = 1; S <= m; ++S)
if (ind[gid(a[S].ft)] < oud[gid(a[S].ft)]) break;
} else if (!(cnt + cnt0)) {
S = 1;
for (v = 2; v <= m; ++v)
if (a[v] < a[S]) S = v;
} else {
cout << "***";
return 0;
}
dfs(S);
if (!ans.empty()) cout << a[ans.top()], ans.pop();
while (!ans.empty()) cout << '.' << a[ans.top()], ans.pop();
return 0;
}