AC前五个点,后六个点WA
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <cstring>
using namespace std;
const int N = 1010;
struct edge
{
int v;
string w;
};
vector<edge> g[N];
int vis[N]{};
stack<int> st;
string word;
int S = 0x7fffffff, m, d[N][2];
inline static bool cmp(edge a, edge b)
{
return a.w < b.w;
}
inline static void dfs(int x)
{
for (int i = vis[x]; i < g[x].size(); i = vis[x])
{
vis[x] = i + 1;
dfs(g[x][i].v);
}
st.push(x);
st.push(-1);
return;
}
int main()
{
cin >> m;
for (int i = 1; i <= m; i++)
{
cin >> word;
int u = word[0], v = word[word.size() - 1];
g[u].push_back({ v, word });
S = min({ S, u, v });
d[v][0]++;
d[u][1]++;
}
int cnt[2] = { 0, 0 };
bool f = 0;
for (int i = 'a'; i <= 'z'; i++)
{
if (!g[i].empty())
sort(g[i].begin(), g[i].end(), cmp);
if (d[i][0] != d[i][1])
{
f = 1;
if (d[i][0] - d[i][1] == 1)
cnt[0]++;
else if (d[i][1] - d[i][0] == 1)
{
cnt[1]++;
S = i;
}
else
{
cout << "***" << endl;
return 0;
}
}
}
if (f && (cnt[0] ^ 1 || cnt[1] ^ 1))
{
cout << "***" << endl;
return 0;
}
dfs(S);
// 判断图联通
int sum = 0;
for (int i = 1; i < N; i++)
sum += vis[i];
if (sum < m)
{
cout << "***" << endl;
return 0;
}
memset(vis, 0, sizeof(vis));
st.pop();
while (st.size() > 2)
{
int s = st.top();
if (s != -1)
{
cout << g[s][vis[s]].w;
vis[s]++;
st.pop();
}
else
{
cout << ".";
st.pop();
}
}
return 0;
}