public override void Solve(IOManager io) { const string Inf = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; var n = io.ReadInt(); var edgeCount = io.ReadInt(); var length = io.ReadInt(); var originalCharList = new char[n]; for (int i = 0; i < originalCharList.Length; i++) { originalCharList[i] = io.ReadChar(); } var originalGraph = new Internal.SCCGraph(n); var edges = new Edge[edgeCount]; for (int i = 0; i < edges.Length; i++) { var a = io.ReadInt(); var b = io.ReadInt(); a--; b--; edges[i] = new Edge(a, b); originalGraph.AddEdge(a, b); } var(groupCount, ids) = originalGraph.SCCIDs(); var graph = new BasicGraph(groupCount + 1); foreach (var(from, to) in edges) { if (ids[from] != ids[to]) { var contains = false; foreach (var next in graph[ids[from] + 1]) { contains |= next == ids[to] + 1; } if (!contains) { graph.AddEdge(ids[from] + 1, ids[to] + 1); } } } for (int i = 1; i < graph.NodeCount; i++) { graph.AddEdge(0, i); } var dp = new string[graph.NodeCount, length + 1]; dp.Fill(Inf); dp[0, 0] = ""; var charList = Enumerable.Repeat(0, graph.NodeCount).Select(_ => new List <char>()).ToArray(); for (int i = 0; i < originalCharList.Length; i++) { charList[ids[i] + 1].Add(originalCharList[i]); } foreach (var c in charList) { c.Sort(); } for (int i = 0; i < graph.NodeCount; i++) { for (int l = 0; l <= length; l++) { foreach (var next in graph[i]) { var newString = dp[i, l]; if (newString == Inf) { continue; } ChangeMin(ref dp[next, l], newString); for (int append = 0; append < charList[next].Count; append++) { newString += charList[next][append]; if (newString.Length <= length) { ChangeMin(ref dp[next, newString.Length], newString); } else { break; } } } } } var result = Inf; for (int i = 0; i < graph.NodeCount; i++) { ChangeMin(ref result, dp[i, length]); } if (result != Inf) { io.WriteLine(result); } else { io.WriteLine(-1); } }
/// <summary> /// <see cref="SCCGraph"/> クラスの新しいインスタンスを、<paramref name="n"/> 頂点 0 辺の有向グラフとして初期化します。 /// </summary> /// <remarks> /// <para>制約: 0≤<paramref name="n"/>≤10^8</para> /// <para>計算量: O(<paramref name="n"/>)</para> /// </remarks> public SCCGraph(int n) { Debug.Assert(unchecked ((uint)n <= 100_000_000)); _internal = new Internal.SCCGraph(n); }