結果
問題 | No.470 Inverse S+T Problem |
ユーザー |
![]() |
提出日時 | 2016-12-20 01:01:03 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 34 ms / 2,000 ms |
コード長 | 5,830 bytes |
コンパイル時間 | 1,210 ms |
コンパイル使用メモリ | 111,872 KB |
実行使用メモリ | 19,712 KB |
最終ジャッジ日時 | 2024-12-22 13:11:46 |
合計ジャッジ時間 | 3,539 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 27 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;using System.IO;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Collections.Generic;using System.Diagnostics;using System.Numerics;using Enu = System.Linq.Enumerable;public class Program{static readonly string NG = "Impossible";static readonly int Atmost = 52 + 52 * 52;public void Solve(){int N = Reader.Int();if (N > Atmost / 2) { Console.WriteLine(NG); return; }var S = Reader.StringArray(N);var scc = new StronglyConnectedComponent(N * 2);for (int a = 0; a < N; a++)for (int b = a + 1; b < N; b++)for (int alen = 1; alen <= 2; alen++)for (int blen = 1; blen <= 2; blen++){string a1 = S[a].Substring(0, alen), a2 = S[a].Substring(alen);string b1 = S[b].Substring(0, blen), b2 = S[b].Substring(blen);int aid = a + (alen - 1) * N;int bid = b + (2 - blen) * N;if (a1 == b1 || a1 == b2 || a2 == b1 || a2 == b2){scc.AddEdge(a + (alen - 1) * N, b + (2 - blen) * N);scc.AddEdge(b + (blen - 1) * N, a + (2 - alen) * N);}}scc.Decompose();if (Enu.Range(0, N).Any(i => scc.Component(i) == scc.Component(N + i))){Console.WriteLine(NG);return;}for (int i = 0; i < N; i++)if (scc.Component(i) > scc.Component(N + i))Console.WriteLine(S[i].Insert(1, " "));elseConsole.WriteLine(S[i].Insert(2, " "));}}class Component{public int[] Vertexes;public int[] Edges;}class StronglyConnectedComponent{public int NumComponents { get; private set; }public int[] Vertexes(int at) { return vertexes[component[at]].ToArray(); }public int Component(int v) { return component[v]; }private readonly int[] component;private readonly List<int>[] E, RevE;private readonly List<List<int>> vertexes = new List<List<int>>();public StronglyConnectedComponent(int N){component = new int[N];E = new List<int>[N];RevE = new List<int>[N];for (int i = 0; i < N; i++){component[i] = -1;E[i] = new List<int>();RevE[i] = new List<int>();}}public void AddEdge(int from, int to){E[from].Add(to);RevE[to].Add(from);}public void Decompose(){var vs = new List<int>();var seen = new bool[E.Length];for (int v = 0; v < E.Length; v++)if (!seen[v]) DFS(v, seen, vs);vs.Reverse();foreach (int v in vs)if (component[v] == -1){vertexes.Add(new List<int>());DFSRev(v, NumComponents++);}}public Component[] GetComponents(){var components = new Component[vertexes.Count];for (int i = 0; i < components.Length; i++){components[i] = new Component();components[i].Vertexes = vertexes[i].ToArray();var es = new HashSet<int>();foreach (int v in components[i].Vertexes)foreach (int next in E[v])if (component[next] != i)es.Add(component[next]);components[i].Edges = es.ToArray();}return components;}private void DFS(int v, bool[] seen, List<int> vs){seen[v] = true;foreach (int next in E[v])if (!seen[next]) DFS(next, seen, vs);vs.Add(v);}private void DFSRev(int v, int num){component[v] = num;vertexes[num].Add(v);foreach (int next in RevE[v])if (component[next] == -1) DFSRev(next, num);}}class Entry { static void Main() { new Program().Solve(); } }class Reader{static TextReader reader = Console.In;static readonly char[] separator = { ' ' };static readonly StringSplitOptions op = StringSplitOptions.RemoveEmptyEntries;static string[] A = new string[0];static int i;static void Init() { A = new string[0]; }public static void Set(TextReader r) { reader = r; Init(); }public static void Set(string file) { reader = new StreamReader(file); Init(); }public static bool HasNext() { return CheckNext(); }public static string String() { return Next(); }public static int Int() { return int.Parse(Next()); }public static long Long() { return long.Parse(Next()); }public static double Double() { return double.Parse(Next()); }public static int[] IntLine() { return Array.ConvertAll(Split(Line()), int.Parse); }public static int[] IntArray(int N) { return Range(N, Int); }public static int[][] IntTable(int H) { return Range(H, IntLine); }public static string[] StringArray(int N) { return Range(N, Next); }public static string[][] StringTable(int N) { return Range(N, () => Split(Line())); }public static string Line() { return reader.ReadLine().Trim(); }public static T[] Range<T>(int N, Func<T> f) { var r = new T[N]; for (int i = 0; i < N; r[i++] = f()) ; return r; }static string[] Split(string s) { return s.Split(separator, op); }static string Next() { CheckNext(); return A[i++]; }static bool CheckNext(){if (i < A.Length) return true;string line = reader.ReadLine();if (line == null) return false;if (line == "") return CheckNext();A = Split(line);i = 0;return true;}}