Advertisement
Guest User

Fixed Set

a guest
Nov 19th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4.  
  5. void Configure()
  6. {
  7. std::cin.tie(nullptr);
  8. std::ios_base::sync_with_stdio(false);
  9. }
  10.  
  11.  
  12. long long sqr(long long number)
  13. {
  14. return number * number;
  15. }
  16.  
  17.  
  18. class SquareHashTable
  19. {
  20. int numbers_count;
  21. std::vector<int> table;
  22.  
  23. long long prime = 4000000007;
  24. long long first_coefficient, second_coefficient;
  25.  
  26. int absent_number = 4294979831;
  27.  
  28. public:
  29. SquareHashTable()
  30. {
  31.  
  32. }
  33.  
  34. void Initialize(std::vector<int> & numbers)
  35. {
  36. numbers_count = static_cast<int>(numbers.size());
  37. if (numbers_count <= 0)
  38. {
  39. return;
  40. }
  41. while (1 > 0)
  42. {
  43. bool necessary_to_repeat = false;
  44. table = std::vector<int>(numbers_count * numbers_count, absent_number);
  45. first_coefficient = ((long long)rand() * rand()) % prime;
  46. second_coefficient = ((long long)rand() * rand()) % prime;
  47. for (int i = 0; i < static_cast<int>(numbers.size()); ++i)
  48. {
  49. int current_number = numbers[i];
  50. long long new_hash = compute_hash(current_number);
  51.  
  52. if (table[new_hash] != absent_number)
  53. {
  54. necessary_to_repeat = true;
  55. break;
  56. }
  57. table[new_hash] = current_number;
  58. }
  59. if (!necessary_to_repeat)
  60. {
  61. break;
  62. }
  63. }
  64. }
  65.  
  66. bool Contains(const int & number) const
  67. {
  68. if (static_cast<int>(table.size()) <= 0)
  69. {
  70. return false;
  71. }
  72. long long hash = compute_hash(number);
  73. return table[hash] == number;
  74. }
  75.  
  76. private:
  77. long long compute_hash(int number) const
  78. {
  79. return (first_coefficient * (number + 1000000000) + second_coefficient)
  80. % prime % numbers_count;
  81. }
  82. };
  83.  
  84.  
  85. class FixedSet
  86. {
  87. int groups_count;
  88. long long prime = 4294979831;
  89. std::vector<SquareHashTable> table;
  90.  
  91. long long first_coefficient;
  92. long long second_coefficient;
  93.  
  94. public:
  95. FixedSet()
  96. {
  97.  
  98. }
  99.  
  100. void Initialize(const std::vector<int> & numbers)
  101. {
  102. groups_count = static_cast<int>(numbers.size());
  103. if (groups_count <= 0)
  104. {
  105. return;
  106. }
  107. std::vector<std::vector<int>> groups;
  108. generate_groups(numbers, &groups);
  109. generate_square_hash_tables(groups);
  110. }
  111.  
  112. bool Contains(const int & number) const
  113. {
  114. if (groups_count <= 0)
  115. {
  116. return false;
  117. }
  118. long long hash = compute_hash(number);
  119. return table[hash].Contains(number);
  120. }
  121.  
  122. private:
  123. void generate_square_hash_tables(std::vector<std::vector<int>> & groups)
  124. {
  125. for (int i = 0; i < static_cast<int>(groups.size()); ++i)
  126. {
  127. SquareHashTable hashTable;
  128. hashTable.Initialize(groups[i]);
  129. table.push_back(hashTable);
  130. }
  131. }
  132.  
  133. void generate_groups(const std::vector<int> & numbers, std::vector<std::vector<int>> * groups)
  134. {
  135. do
  136. {
  137. (*groups) = std::vector<std::vector<int >> (static_cast<int>(
  138. numbers.size()), std::vector<int>());
  139. first_coefficient = ((long long)rand() * rand()) % prime;
  140. second_coefficient = ((long long)rand() * rand()) % prime;
  141. for (int i = 0; i < groups_count; ++i)
  142. {
  143. int current_element = numbers[i];
  144. long long new_element_hash = compute_hash(current_element);
  145. groups->at(new_element_hash).push_back(current_element);
  146. }
  147. } while (groups_powers_squares_sum(groups) > 10 * groups_count);
  148. }
  149.  
  150. static long long groups_powers_squares_sum(std::vector<std::vector<int>> * groups)
  151. {
  152. long long sum = 0;
  153. for (int i = 0; i < static_cast<int>(groups->size()); ++i)
  154. {
  155. sum += sqr(static_cast<long long>(groups->at(i).size()));
  156. }
  157. return sum;
  158. }
  159.  
  160. long long compute_hash(int number) const
  161. {
  162. long long sum = first_coefficient * (number + 1000000000) + second_coefficient;
  163. long long first_mod = sum % prime;
  164. long long second_mod = first_mod % groups_count;
  165. return second_mod;
  166. }
  167. };
  168.  
  169.  
  170. void Input(std::vector<int> * numbers, std::vector<int> * requests)
  171. {
  172. int numbers_count;
  173. std::cin >> numbers_count;
  174. for (int i = 0; i < numbers_count; ++i)
  175. {
  176. int new_number;
  177. std::cin >> new_number;
  178. numbers->push_back(new_number);
  179. }
  180.  
  181. int requests_count;
  182. std::cin >> requests_count;
  183. for (int i = 0; i < requests_count; ++i)
  184. {
  185. int new_request;
  186. std::cin >> new_request;
  187. requests->push_back(new_request);
  188. }
  189. }
  190.  
  191.  
  192. void Solve(std::vector<int> & numbers, std::vector<int> & requests, std::vector<bool> * responses)
  193. {
  194. FixedSet fixedSet = FixedSet();
  195. fixedSet.Initialize(numbers);
  196.  
  197. for (auto request : requests)
  198. {
  199. responses->push_back(fixedSet.Contains(request));
  200. }
  201. }
  202.  
  203.  
  204. void Output(std::vector<bool> & responses)
  205. {
  206. for (int i = 0; i < static_cast<int>(responses.size()); ++i)
  207. {
  208. std::cout << (responses[i] ? "Yes" : "No") << "\n";
  209. }
  210. }
  211.  
  212.  
  213. int main()
  214. {
  215. Configure();
  216.  
  217. std::vector<int> numbers, requests;
  218. Input(&numbers, &requests);
  219.  
  220. std::vector<bool> responses;
  221. Solve(numbers, requests, &responses);
  222.  
  223. Output(responses);
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement