Пример #1
0
        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);
            }
        }
Пример #2
0
 /// <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);
 }