Advertisement
12311k

Untitled

Mar 21st, 2021
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <set>
  4. #include <string>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. string ReadLine() {
  10. string s;
  11. getline(cin, s);
  12. return s;
  13. }
  14.  
  15. int ReadLineWithNumber() {
  16. int result;
  17. cin >> result;
  18. ReadLine();
  19. return result;
  20. }
  21.  
  22. vector<string> SplitIntoWords(const string& text) {
  23. vector<string> words;
  24. string word;
  25. for (const char c : text) {
  26. if (c == ' ') {
  27. words.push_back(word);
  28. word = "";
  29. } else {
  30. word += c;
  31. }
  32. }
  33. words.push_back(word);
  34.  
  35. return words;
  36. }
  37.  
  38. set<string> ParseStopWords(const string& text) {
  39. set<string> stop_words;
  40. for (const string& word : SplitIntoWords(text)) {
  41. stop_words.insert(word);
  42. }
  43. return stop_words;
  44. }
  45.  
  46. vector<string> SplitIntoWordsNoStop(const string& text, const set<string>& stop_words) {
  47. vector<string> words;
  48. for (const string& word : SplitIntoWords(text)) {
  49. if (stop_words.count(word) == 0) {
  50. words.push_back(word);
  51. }
  52. }
  53. return words;
  54. }
  55.  
  56. void AddDocument(map<string, set<int>>& word_to_documents,
  57. const set<string>& stop_words,
  58. int document_id,
  59. const string& document) {
  60. for (const string& word : SplitIntoWordsNoStop(document, stop_words)) {
  61. word_to_documents[word].insert(document_id);
  62. }
  63. }
  64.  
  65. // For each document returns its id and relevance
  66. vector<pair<int, int>> FindDocuments(
  67. const map<string, set<int>>& word_to_documents,
  68. const set<string>& stop_words,
  69. const string& query) {
  70. const vector<string> query_words = SplitIntoWordsNoStop(query, stop_words);
  71. map<int, int> document_to_relevance;
  72. for (const string& word : query_words) {
  73. if (word_to_documents.count(word) == 0) {
  74. continue;
  75. }
  76. for (const int document_id : word_to_documents.at(word)) {
  77. ++document_to_relevance[document_id];
  78. }
  79. }
  80.  
  81. vector<pair<int, int>> found_documents;
  82. for (auto [document_id, relevance] : document_to_relevance) {
  83. found_documents.push_back({document_id, relevance});
  84. }
  85. return found_documents;
  86. }
  87.  
  88. int main() {
  89. const string stop_words_joined = ReadLine();
  90. const set<string> stop_words = ParseStopWords(stop_words_joined);
  91.  
  92. // Read documents
  93. map<string, set<int>> word_to_documents;
  94. const int document_count = ReadLineWithNumber();
  95. for (int document_id = 0; document_id < document_count; ++document_id) {
  96. AddDocument(word_to_documents, stop_words, document_id, ReadLine());
  97. }
  98.  
  99. const string query = ReadLine();
  100. for (auto [document_id, relevance] : FindDocuments(word_to_documents, stop_words, query)) {
  101. cout << "{ document_id = "s << document_id << ", relevance = "s << relevance << " }"s << endl;
  102. }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement