Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Map
  7. {
  8.  
  9. static const long long m = 317;
  10. long long size = 0;
  11.  
  12. struct MapList
  13. {
  14. MapList* prev = NULL;
  15. string value;
  16. MapList* next = NULL;
  17. };
  18.  
  19. vector<MapList*> set;
  20.  
  21. static long long GetHash(string& x)
  22. {
  23. const int p = 31;
  24. long long hash = 0, p_pow = 1;
  25. for (char i : x)
  26. {
  27. hash += (i - 'a' + 1) * p_pow;
  28. p_pow *= p;
  29. }
  30.  
  31. if (hash >= 0)
  32. return hash % m;
  33. else
  34. return (m - abs(hash) % m) % m;
  35. }
  36.  
  37. public:
  38.  
  39. Map() {
  40. size = 0;
  41. set = vector<MapList*>(m);
  42. }
  43.  
  44.  
  45. MapList* CreateNode(string key) {
  46. auto node = new MapList;
  47. node->prev = NULL;
  48. node->value = key;
  49. node->next = NULL;
  50. return node;
  51. }
  52.  
  53. MapList* AddNode(MapList* tail, string key)
  54. {
  55. MapList* node = CreateNode(key);
  56. node->prev = tail;
  57. tail->next = node;
  58. node->value = key;
  59. return node;
  60. }
  61.  
  62.  
  63. void add(string x)
  64. {
  65. long long h = GetHash(x);
  66. MapList* head = set[GetHash(x)];
  67. if (head == NULL)
  68. {
  69. set[GetHash(x)] = CreateNode(x);
  70. size++;
  71. }
  72. else
  73. {
  74. MapList* pointer = set[GetHash(x)];
  75. while (pointer->next != NULL)
  76. {
  77. if (pointer->value == x)
  78. return;
  79. pointer = pointer->next;
  80. }
  81. if (pointer->value != x)
  82. {
  83. AddNode(pointer, x);
  84. size++;
  85. }
  86. }
  87. }
  88.  
  89. void remove(string x)
  90. {
  91. MapList* pointer = set[GetHash(x)];
  92. if (pointer == NULL) return;
  93.  
  94. if (pointer->value == x)
  95. {
  96. set[GetHash(x)] = pointer->next;
  97. size--;
  98. free(pointer);
  99. return;
  100. }
  101.  
  102. while (pointer != NULL)
  103. {
  104. if (pointer->value == x)
  105. {
  106. if (pointer->prev != NULL)
  107. pointer->prev->next = pointer->next;
  108. if (pointer->next != NULL)
  109. pointer->next->prev = pointer->prev;
  110. size--;
  111. free(pointer);
  112. return;
  113. }
  114. pointer = pointer->next;
  115. }
  116.  
  117. }
  118.  
  119. void print()
  120. {
  121. cout << size << " ";
  122. for (long long i = 0; i < m; ++i)
  123. {
  124. if (set[i] != NULL)
  125. {
  126. MapList* pointer = set[i];
  127. while (pointer != NULL)
  128. {
  129. cout << pointer->value << " ";
  130. pointer = pointer->next;
  131. }
  132. }
  133. }
  134. cout << "\n";
  135. }
  136.  
  137. };
  138.  
  139. struct MapNode
  140. {
  141. MapNode* prev = NULL;
  142. string key;
  143. Map values;
  144. MapNode* next = NULL;
  145. };
  146.  
  147. MapNode* MapCreateNode(string& key, string& value)
  148. {
  149. auto node = new MapNode;
  150. node->prev = NULL;
  151. node->key = key;
  152. node->values = Map();
  153. node->values.add(value);
  154. node->next = NULL;
  155. return node;
  156. }
  157.  
  158. MapNode* MapAddNode(MapNode* tail, string& key, string& value)
  159. {
  160. MapNode* node = MapCreateNode(key, value);
  161. node->prev = tail;
  162. tail->next = node;
  163. return node;
  164. }
  165.  
  166. long long GetHash(string& x)
  167. {
  168. const int p = 31;
  169. long long hash = 0, p_pow = 1;
  170. for (char i : x)
  171. {
  172. hash += (i - 'a' + 1) * p_pow;
  173. p_pow *= p;
  174. }
  175.  
  176. long long m = 1000003;
  177. if (hash >= 0)
  178. return hash % m;
  179. else
  180. return (m - abs(hash) % m) % m;
  181.  
  182. }
  183.  
  184. void Put(string& key, string& value, vector<MapNode*>& set)
  185. {
  186. MapNode* head = set[GetHash(key)];
  187. if (head == NULL)
  188. set[GetHash(key)] = MapCreateNode(key, value);
  189. else
  190. {
  191. MapNode* pointer = set[GetHash(key)];
  192. while (pointer->next != NULL)
  193. {
  194. if (pointer->key == key)
  195. {
  196. pointer->values.add(value);
  197. return;
  198. }
  199. pointer = pointer->next;
  200. }
  201. if (pointer->key != key)
  202. MapAddNode(pointer, key, value);
  203. else
  204. pointer->values.add(value);
  205. }
  206. }
  207.  
  208. void Delete(string key, string value, vector<MapNode*>& set)
  209. {
  210. MapNode* pointer = set[GetHash(key)];
  211.  
  212. while (pointer != NULL)
  213. {
  214. if (pointer->key == key)
  215. {
  216. pointer->values.remove(value);
  217. return;
  218. }
  219. pointer = pointer->next;
  220. }
  221. }
  222.  
  223. void DeleteAll(string key, vector<MapNode*>& set)
  224. {
  225. MapNode* pointer = set[GetHash(key)];
  226. if (pointer == NULL) return;
  227.  
  228. if (pointer->key == key)
  229. {
  230. set[GetHash(key)] = pointer->next;
  231. free(pointer);
  232. return;
  233. }
  234.  
  235. while (pointer != NULL)
  236. {
  237. if (pointer->key == key)
  238. {
  239. if (pointer->prev != NULL)
  240. pointer->prev->next = pointer->next;
  241. if (pointer->next != NULL)
  242. pointer->next->prev = pointer->prev;
  243. free(pointer);
  244. return;
  245. }
  246. pointer = pointer->next;
  247. }
  248.  
  249. }
  250.  
  251. bool Get(string& key, vector<MapNode*>& set)
  252. {
  253. MapNode* pointer = set[GetHash(key)];
  254.  
  255. while (pointer != NULL)
  256. {
  257. if (pointer->key == key)
  258. {
  259. pointer->values.print();
  260. return true;
  261. }
  262. pointer = pointer->next;
  263. }
  264.  
  265. cout << "0\n";
  266. return false;
  267. }
  268.  
  269.  
  270. int main() {
  271. ios_base::sync_with_stdio(false);
  272. cin.tie(NULL);
  273. freopen("multimap.in", "r", stdin);
  274. freopen("multimap.out", "w", stdout);
  275.  
  276. vector<MapNode*> set = vector<MapNode*>(1000003);
  277.  
  278. string line;
  279. string key, value;
  280. while (cin >> line) {
  281. cin >> key;
  282. if (line == "put")
  283. {
  284. cin >> value;
  285. Put(key, value, set);
  286. }
  287. else if (line == "delete")
  288. {
  289. cin >> value;
  290. Delete(key, value, set);
  291. }
  292. else if (line == "deleteall")
  293. DeleteAll(key, set);
  294.  
  295. else if (line == "get")
  296. Get(key, set);
  297. }
  298. return 0;
  299. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement