Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. using namespace std;
  5. struct Node
  6. {
  7. string key;
  8. string value;
  9.  
  10. Node* nextH;
  11. Node* next;
  12. Node* prev;
  13.  
  14. Node(string key, string value, Node* prev, Node* next)
  15. {
  16. this->key = key;
  17. this->value = value;
  18. this->nextH = NULL;
  19. this->next = next;
  20. this->prev = prev;
  21. }
  22.  
  23. };
  24.  
  25. struct LinkedHashMap
  26. {
  27. unsigned int MOD = 96557;
  28. vector<Node*> table;
  29.  
  30. Node* header;
  31.  
  32.  
  33. LinkedHashMap()
  34. {
  35. header = new Node("none", "none", NULL, NULL);
  36. header->prev = header;
  37. header->next = header;
  38. table.resize(MOD);
  39. }
  40.  
  41. int hash(string& s)
  42. {
  43. int multiplier = 263;
  44. int prime = 1000000007;
  45. unsigned long long hash = 0;
  46. for (int i = s.size() - 1; i >= 0; --i)
  47. hash = (hash* multiplier + s[i]) % prime;
  48. return static_cast<int>(hash);
  49. }
  50.  
  51.  
  52. void add(string& key, string& value)
  53. {
  54. Node* x = get_value(key);
  55. if (x != NULL)
  56. {
  57. x->value = value;
  58. return;
  59. }
  60. int h = hash(key);
  61. Node* elem = new Node(key, value, header->prev, header);
  62. header->prev->next = elem;
  63. elem->nextH = table[h % MOD];
  64. table[h % MOD] = elem;
  65. header->prev = elem;
  66. }
  67.  
  68. string nextNode(string& key)
  69. {
  70. Node* elem = get_value(key);
  71. return elem == NULL ? "none" : elem->next->value;
  72. }
  73.  
  74. string prev(string& key)
  75. {
  76. Node* elem = get_value(key);
  77. return elem == NULL ? "none" : elem->prev->value;
  78. }
  79.  
  80. string get(string& key)
  81. {
  82. Node* elem = get_value(key);
  83. return elem == NULL ? "none" : elem->value;
  84. }
  85.  
  86. Node* get_value(string& key)
  87. {
  88. Node* elem = table[hash(key) % MOD];
  89. while (elem != NULL)
  90. {
  91. if (elem->key == key)
  92. {
  93. return elem;
  94. }
  95. elem = elem->nextH;
  96. }
  97. return NULL;
  98. }
  99.  
  100. void remove(string& key)
  101. {
  102. int h = hash(key);
  103. Node* elem = table[h % MOD];
  104. Node* prev_elem = NULL;
  105. while (elem != NULL)
  106. {
  107. if (elem->key == key)
  108. {
  109. elem->next->prev = elem->prev;
  110. elem->prev->next = elem->next;
  111. if (prev_elem == NULL)
  112. {
  113. table[h % MOD] = elem->nextH;
  114. }
  115. else
  116. {
  117. prev_elem->nextH = elem->nextH;
  118. elem->nextH = NULL;
  119. }
  120. return;
  121. }
  122. prev_elem = elem;
  123. elem = elem->nextH;
  124. }
  125. }
  126. };
  127.  
  128.  
  129. int main()
  130. {
  131. LinkedHashMap linkedHashMap;
  132. while (!cin.eof())
  133. {
  134. string op;
  135. string key;
  136. cin >> op >> key;
  137. if (op == "put")
  138. {
  139. string Node;
  140. cin >> Node;
  141. linkedHashMap.add(key, Node);
  142. }
  143. if (op == "delete")
  144. {
  145. linkedHashMap.remove(key);
  146. }
  147. if (op == "get")
  148. {
  149. cout << linkedHashMap.get(key) << endl;
  150. }
  151. if (op == "prev")
  152. {
  153. cout << linkedHashMap.prev(key) << endl;
  154. }
  155. if (op == "next")
  156. {
  157. cout << linkedHashMap.nextNode(key) << endl;
  158. }
  159. }
  160. return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement