結果

問題 No.470 Inverse S+T Problem
ユーザー KarakasaDcFdKarakasaDcFd
提出日時 2019-07-12 15:37:13
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,181 bytes
コンパイル時間 2,432 ms
コンパイル使用メモリ 218,292 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-06-01 22:58:23
合計ジャッジ時間 3,510 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 AC 1 ms
6,940 KB
testcase_02 AC 1 ms
6,940 KB
testcase_03 WA -
testcase_04 AC 1 ms
6,940 KB
testcase_05 AC 1 ms
6,940 KB
testcase_06 AC 1 ms
6,940 KB
testcase_07 AC 2 ms
6,944 KB
testcase_08 AC 2 ms
6,944 KB
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 AC 2 ms
6,944 KB
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 AC 2 ms
6,944 KB
testcase_20 AC 1 ms
6,944 KB
testcase_21 AC 2 ms
6,940 KB
testcase_22 AC 1 ms
6,944 KB
testcase_23 AC 2 ms
6,940 KB
testcase_24 AC 2 ms
6,940 KB
testcase_25 AC 1 ms
6,940 KB
testcase_26 AC 2 ms
6,948 KB
testcase_27 AC 2 ms
6,940 KB
testcase_28 AC 1 ms
6,940 KB
testcase_29 AC 2 ms
6,940 KB
testcase_30 AC 1 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"

using namespace std;
using ll = long long;
const double pi = acos(-1);
#define FOR(i,a,b) for (ll i=(a),__last_##i=(b);i<__last_##i;i++)
#define RFOR(i,a,b) for (ll i=(b)-1,__last_##i=(a);i>=__last_##i;i--)
#define REP(i,n) FOR(i,0,n)
#define RREP(i,n) RFOR(i,0,n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) {
	REP(i, v.size()) { if (i)os << " "; os << v[i]; }return os;
}
template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v) {
	REP(i, v.size()) { if (i)os << endl; os << v[i]; }return os;
}

const ll INF = 1LL << 60;
ll MOD = 1000000007;
ll _MOD = 1000000009;
double EPS = 1e-10;

#define int long long

inline void my_io() {

	std::ios::sync_with_stdio(false);

	std::cin.tie(0);

	cout << fixed << setprecision(16);

	//cout << setprecision(10) << scientific << ans << endl;
}

#define ALL(x) (x).begin(),(x).end()

class SAT {
public:
	static const int MAX_V = 2 << 10;
	vector<int> g[MAX_V], rg[MAX_V], vs;
	bool used[MAX_V];
	int cmp[MAX_V], V, N;

	SAT(int n) : V(2 * n), N(n) { ; }

	//(X_2 | !X_5) -> add_closure(2, 1, 5, 0)
	void add_closure(int i, bool bi, int j, bool bj) {
		add_edge(i + N * !bi, j + N * bj);
		add_edge(j + N * !bj, i + N * bi);
	}

	void add_edge(int from, int to) {
		g[from].push_back(to);
		rg[to].push_back(from);
	}

	void dfs(int v) {
		used[v] = true;
		for (int i : g[v]) if (!used[i]) dfs(i);
		vs.push_back(v);
	}

	void rdfs(int v, int k) {
		used[v] = true; cmp[v] = k;
		for (int i : rg[v]) if (!used[i]) rdfs(i, k);
	}

	//no solution: {}, else {1, 0, 1,...}
	vector<bool> solve() {
		memset(used, 0, sizeof(used));
		vs.clear();
		REP(v, V) if (!used[v]) dfs(v);
		memset(used, 0, sizeof(used));
		reverse(ALL(vs));
		int k = 0;
		for (int i : vs) if (!used[i]) rdfs(i, k++);
		vector<bool> res;
		REP(i, N) if (cmp[i] == cmp[i + N]) return res;
		REP(i, N) {
			if (cmp[i] > cmp[N + i]) res.push_back(true);
			else res.push_back(false);
		}
		return res;
	}
};

signed main() {
	ll n;
	string u;

	cin >> n;

	if (n > 60) {
		cout << "Impossible" << endl;
		return 0;
	}

	vector<string> v;

	REP(i, n) {
		cin >> u;
		v.push_back(u);
	}

	SAT s(n);
	string u1, u2;

	REP(i, n) {
		FOR(j, i + 1, n) {
			u1 = v[i];
			u2 = v[j];

			if (u1[0] == u2[0] || u1.substr(1, 2) == u2.substr(1, 2)) {
				s.add_closure(i, 0, j, 0);
			}
			if (u1[0] == u2[2] || u1.substr(1, 2) == u2.substr(0, 2)) {
				s.add_closure(i, 0, j, 1);
			}
			if (u1[2] == u2[0] || u1.substr(0, 2) == u2.substr(1, 2)) {
				s.add_closure(i, 1, j, 0);
			}
			if (u1[2] == u2[2] || u1.substr(0, 2) == u2.substr(0, 2)) {
				s.add_closure(i, 1, j, 1);
			}
		}
	}

	vector<bool> ans = s.solve();

	if (ans.size()) {
		REP(i, n) {
			if (ans[i]) {
				cout << v[i][0];
			}
			else {
				cout << v[i].substr(0, 2);
			}
			cout << " ";
			if (ans[i]) {
				cout << v[i].substr(1, 2);
			}
			else {
				cout << v[i][2];
			}
			cout << endl;
		}
	}
	else {
		cout << "Impossible" << endl;
	}
}
0