如题,WA #2、#6 ~ #10,其余 AC。
解题思路:字母为点,对于每个单词,令其首字母向尾字母连边,然后跑欧拉路。
代码如下:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
int n, c, S, d[1005], del[1005], ans[1005];
char s[1005][25];
struct edge {
int v, i;
bool operator <(const edge &x) const {
return v != x.v ? v < x.v : strcmp(s[i], s[x.i]) < 0;
}
};
std::vector<edge> e[30];
void dfs(int u) {
for(int i = del[u]; i < e[u].size(); i = del[u])
del[u] = i + 1, dfs(e[u][i].v), ans[++c] = e[u][i].i;
}
int main() {
scanf("%d", &n);
for(int i = 0, u, v; i < n; i++)
scanf("%s", s[i]), u = *s[i]-'a', v = s[i][strlen(s[i])-1]-'a',
e[u].emplace_back(edge{v, i}), d[u]++, d[v]--;
for(int i = 25; i >= 0; i--) {
std::sort(e[i].begin(), e[i].end());
if(d[i] == 1) S = i;
}
dfs(S);
if(c != n) puts("***");
else {
for(; c > 1; c--) printf("%s.", s[ans[c]]);
puts(s[ans[1]]);
}
return 0;
}