Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <istream>
  4. #include <cassert>
  5. #include <ostream>
  6. #include <set>
  7. #include <list>
  8. #include <vector>
  9. #include <map>
  10. #include <string>
  11. #include "synchronized.cpp"
  12. #include <unordered_map>
  13. #include <future>
  14. #include <mutex>
  15. #include <shared_mutex>
  16. #define A (26)
  17. #define BIT(k) (1ULL<<(k))
  18. #define TST(u,i) (((u) >> (i)) & 1ull)
  19.  
  20. const size_t oo= numeric_limits<size_t>::max();
  21. using namespace std;
  22.  
  23. class InvertedIndex {
  24. public:
  25. InvertedIndex() {
  26. root= new cell();
  27. }
  28. void Add(string document);
  29. const list<size_t> &Lookup(const string& word) const;
  30. const list<size_t> &Lookup(string_view sv) const;
  31.  
  32. const string& GetDocument(size_t id) const {
  33. return docs[id];
  34. }
  35. int size() const { return docs.size(); }
  36.  
  37. private:
  38. struct cell {
  39. cell *son[A];
  40. unsigned int mask;
  41. size_t id;
  42. cell() {
  43. mask= 0, id= +oo;
  44. }
  45. };
  46. cell *root;
  47. size_t current_id= 0;
  48. size_t insert( const string &s ) {
  49. cell *x= root;
  50. for ( int i= 0; i < s.size(); ++i ) {
  51. auto ch= s[i]-'a';
  52. if ( not TST(x->mask,ch) )
  53. x->mask|= BIT(ch), x->son[ch]= new cell();
  54. x= x->son[ch];
  55. }
  56. if ( x->id < +oo )
  57. return x->id;
  58. index.emplace_back();
  59. x->id= current_id++;
  60. assert( x->id < index.size() );
  61. return x->id;
  62. }
  63. size_t insert( string_view s ) {
  64. cell *x= root;
  65. for ( int i= 0; i < s.size(); ++i ) {
  66. auto ch= s[i]-'a';
  67. if ( not TST(x->mask,ch) )
  68. x->mask|= BIT(ch), x->son[ch]= new cell();
  69. x= x->son[ch];
  70. }
  71. if ( x->id < +oo )
  72. return x->id;
  73. index.emplace_back();
  74. x->id= current_id++;
  75. assert( x->id < index.size() );
  76. return x->id;
  77. }
  78. size_t find( const string &s ) const {
  79. cell *x= root;
  80. for ( int i= 0; i < s.size(); ++i ) {
  81. auto ch= s[i]-'a';
  82. if ( not TST(x->mask,ch) )
  83. return +oo;
  84. x= x->son[ch];
  85. }
  86. if ( x->id < +oo )
  87. return x->id;
  88. return +oo;
  89. }
  90. size_t find( string_view s ) const {
  91. cell *x= root;
  92. for ( int i= 0; i < s.size(); ++i ) {
  93. auto ch= s[i]-'a';
  94. if ( not TST(x->mask,ch) )
  95. return +oo;
  96. x= x->son[ch];
  97. }
  98. if ( x->id < +oo )
  99. return x->id;
  100. return +oo;
  101. }
  102. vector<list<size_t>> index;
  103. vector<string> docs;
  104. list<size_t> empty_list;
  105. };
  106.  
  107. class SearchServer {
  108. public:
  109. SearchServer() = default;
  110. explicit SearchServer(istream& document_input);
  111. void UpdateDocumentBase(istream& document_input);
  112. void AddQueriesStream(istream& query_input, ostream& search_results_output);
  113. private:
  114. Synchronized<InvertedIndex> index;
  115. void AddQueriesStreamWorker( istream& query_input, ostream& search_results_output ) ;
  116. mutex mtx;
  117. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement