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])); } } } }
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}"); } } }