コード例 #1
0
        public void Add(string site, string bookStr)
        {
            var book   = JsonConvert.DeserializeObject <Book>(bookStr);
            var bookId = CalculateBookId(book);

            if (!_bookTries.TryGetValue(bookId, out var bookRootTrie))
            {
                _bookTries[bookId] = bookRootTrie = new BookTrie();
            }

            var queue = new Queue <(Section section, BookTrie trie)>();

            queue.Enqueue((book, bookRootTrie));
            while (queue.Count > 0)
            {
                var(section, trie) = queue.Dequeue();
                if (section.Problems != null)
                {
                    while (trie.Problems.Count < section.Problems.Count)
                    {
                        trie.Problems.Add(new MatchingProblemsSet()
                        {
                            ProblemFullIds = new List <ProblemFullId>()
                        });
                    }
                    for (var i = 0; i < section.Problems.Count; i++)
                    {
                        var problemFullId = new ProblemFullId()
                        {
                            Site = site, ProblemId = section.Problems[i].Id
                        };
                        trie.Problems[i].ProblemFullIds.Add(problemFullId);
                        _matchingProblemsSets.Add(problemFullId, trie.Problems[i]);
                    }
                }

                if (section.Sections != null)
                {
                    while (trie.InnerSections.Count < section.Sections.Count)
                    {
                        trie.InnerSections.Add(new BookTrie());
                    }
                    for (var i = 0; i < section.Sections.Count; i++)
                    {
                        queue.Enqueue((section.Sections[i], trie.InnerSections[i]));
                    }
                }
            }
        }
コード例 #2
0
        public void Find(string site, string problemId, StringBuilder output)
        {
            var fullProblemId = new ProblemFullId()
            {
                Site = site, ProblemId = problemId,
            };

            if (!_matchingProblemsSets.TryGetValue(fullProblemId, out var matchingProblems))
            {
                output.AppendLine("0");
                return;
            }

            output.AppendLine((matchingProblems.ProblemFullIds.Count - 1).ToString());
            foreach (var otherProblemId in matchingProblems.ProblemFullIds)
            {
                if (otherProblemId.Site != site)
                {
                    output.AppendLine($"{otherProblemId.Site} {otherProblemId.ProblemId}");
                }
            }
        }