73pts,WA on #7#8#10
  • 板块P1127 词链
  • 楼主xuan_never
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/9 22:26
  • 上次更新2024/6/10 11:02:21
查看原帖
73pts,WA on #7#8#10
1017253
xuan_never楼主2024/6/9 22:26

调不动了
并查集判联通+排序+欧拉回路

#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;
}
2024/6/9 22:26
加载中...