vadimk772336

как у вани

Nov 25th, 2021 (edited)
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdexcept>
  4. #include <cstring>
  5. #include <random>
  6. #include <utility>
  7. #include <ctime>
  8.  
  9. std::random_device rand_dev;
  10. std::mt19937 generator(rand_dev());
  11.  
  12. struct vertex
  13. {
  14. bool visited = false;
  15. std::vector<struct adj_vertex> adj_list;
  16. int list_size = 0;
  17. long long int label = 0;
  18. };
  19.  
  20. struct adj_vertex
  21. {
  22. int idx;
  23. int edge_value;
  24. };
  25.  
  26.  
  27. class FixedSet
  28. {
  29. int count_numbers;
  30. int size;
  31. long long int alpha_a, alpha_b, beta_a, beta_b;
  32. int const shift = 1000000000;
  33. int const p = 2000000033;
  34. std::vector<int> table;
  35. std::vector<int> A;
  36.  
  37. public:
  38. FixedSet();
  39. void Initialize(const std::vector<int>& numbers);
  40. bool Contains(int number) const;
  41.  
  42. long long int rand_int(int min, int max)
  43. {
  44. std::uniform_int_distribution<int> distr(min, max);
  45. return distr(generator);
  46. }
  47.  
  48. long long int uni_hash(long long int a, long long int b, int m, int key) const
  49. {
  50. return ((a * key + b) % p) % size;
  51. }
  52.  
  53. class Graph
  54. {
  55. struct vertex* G;
  56.  
  57. public:
  58. explicit Graph(int n);
  59. int get_size();
  60. void addEdge(int i, int j, int key_idx);
  61. void DFS(int v_idx, int value, bool& flag, int n);
  62. bool is_correct(int n, int m);
  63. long long int get_label(int number_vertex);
  64. void clear(int m);
  65. };
  66. };
  67.  
  68. FixedSet::Graph::Graph(int n)
  69. {
  70. G = new vertex[n];
  71. for (int i = 0; i < n; ++i)
  72. {
  73. G[i].list_size = 0;
  74. G[i].label = 0;
  75. G[i].visited = false;
  76. }
  77. }
  78.  
  79. long long int FixedSet::Graph::get_label(int number_vertex)
  80. {
  81. return G[number_vertex].label;
  82. }
  83.  
  84.  
  85. void FixedSet::Graph::clear(int m)
  86. {
  87. for (int i = 0; i < m; ++i)
  88. {
  89. G[i].adj_list.clear();
  90. G[i].list_size = 0;
  91. G[i].label = 0;
  92. G[i].visited = false;
  93. }
  94. }
  95.  
  96. void FixedSet::Graph::addEdge(int i, int j, int key_idx)
  97. {
  98. adj_vertex buff;
  99. buff.idx = j;
  100. buff.edge_value = key_idx;
  101.  
  102. G[i].adj_list.push_back(buff);
  103.  
  104. buff.idx = i;
  105. G[j].adj_list.push_back(buff);
  106.  
  107. G[i].list_size++;
  108. G[j].list_size++;
  109. }
  110.  
  111. void FixedSet::Graph::DFS(int v_idx, int value, bool& flag, int n)
  112. {
  113.  
  114. if (flag)
  115. {
  116. G[v_idx].visited = true;
  117. G[v_idx].label = value;
  118.  
  119. vertex u;
  120. std::vector<struct adj_vertex> curr_list = G[v_idx].adj_list;
  121. int u_idx, val, edge_value;
  122.  
  123. for (int i = 0; i < G[v_idx].list_size; ++i)
  124. {
  125.  
  126. u_idx = curr_list[i].idx;
  127. u = G[u_idx];
  128. edge_value = curr_list[i].edge_value;
  129.  
  130. if (!(u.visited))
  131. {
  132. val = edge_value - value;
  133. DFS(u_idx, val, flag, n);
  134. }
  135.  
  136. if (((G[u_idx].label + G[v_idx].label) % n) != edge_value)
  137. {
  138. flag = false;
  139. break;
  140. }
  141. }
  142. }
  143. }
  144.  
  145.  
  146. bool FixedSet::Graph::is_correct(int n, int m)
  147. {
  148.  
  149. bool flag = true;
  150. for (int i = 0; i < m; ++i)
  151. {
  152. if (!G[i].visited)
  153. DFS(i, 0, flag, n);
  154. if (!flag)
  155. return false;
  156. }
  157. return true;
  158. }
  159.  
  160.  
  161. FixedSet::FixedSet()
  162. {
  163. this->count_numbers = 0;
  164. this->size = 0;
  165. }
  166.  
  167. void FixedSet::Initialize(const std::vector<int>& numbers)
  168. {
  169. table.clear();
  170. A.clear();
  171. this->count_numbers = 0;
  172. this->size = 0;
  173.  
  174. if (!numbers.empty())
  175. {
  176.  
  177. int n = numbers.size();
  178. int m = 3 * n;
  179.  
  180. this->count_numbers = n;
  181. this->size = m;
  182.  
  183. Graph g(m);
  184.  
  185. for (int i = 0; i < n; ++i)
  186. table.push_back(numbers[i] + shift);
  187.  
  188. long long int alpha_k, beta_k;
  189. bool flag = false;
  190.  
  191. while (!flag)
  192. {
  193. g.clear(m);
  194.  
  195. this->alpha_a = rand_int(1, p - 1);
  196. this->alpha_b = rand_int(0, p - 1);
  197. this->beta_a = rand_int(1, p - 1);
  198. this->beta_b = rand_int(0, p - 1);
  199.  
  200. for (int i = 0; i < n; ++i)
  201. {
  202. alpha_k = uni_hash(alpha_a, alpha_b, m, numbers[i] + shift);
  203. beta_k = uni_hash(beta_a, beta_b, m, numbers[i] + shift);
  204. g.addEdge(alpha_k, beta_k, i);
  205. }
  206.  
  207. if (g.is_correct(n, m))
  208. {
  209. flag = true;
  210. }
  211. }
  212.  
  213. for (int i = 0; i < m; ++i)
  214. A.push_back(g.get_label(i));
  215. }
  216. }
  217.  
  218. bool FixedSet::Contains(int number) const
  219. {
  220. if (this->size == 0)
  221. return false;
  222.  
  223. int m = this->size;
  224. int n = this->count_numbers;
  225. int hash_alpha = uni_hash(this->alpha_a, this->alpha_b, m, number + shift);
  226. int hash_beta = uni_hash(this->beta_a, this->beta_b, m, number + shift);
  227.  
  228. int idx = (A[hash_alpha] + A[hash_beta]) % n;
  229.  
  230. if (0 <= idx)
  231. return (this->table[idx] == (number + shift));
  232.  
  233. return false;
  234. }
  235.  
  236. std::vector<int> ReadSequence()
  237. {
  238. size_t size;
  239. std::cin >> size;
  240. std::vector<int> sequence(size);
  241. for (auto& current : sequence)
  242. {
  243. std::cin >> current;
  244. }
  245. return sequence;
  246. }
  247.  
  248. std::vector<bool> PerformRequests(const std::vector<int>& requests, const FixedSet& set)
  249. {
  250. std::vector<bool> request_answers;
  251. request_answers.reserve(requests.size());
  252. for (int request : requests)
  253. {
  254. request_answers.push_back(set.Contains(request));
  255. }
  256. return request_answers;
  257. }
  258.  
  259. void PrintRequestsResponse(const std::vector<bool>& request_answers)
  260. {
  261. for (bool answer : request_answers)
  262. {
  263. std::cout << (answer ? "Yes" : "No") << "\n";
  264. }
  265. }
  266.  
  267. int main(int argc, char** argv)
  268. {
  269.  
  270. std::ios::sync_with_stdio(false);
  271. auto numbers = ReadSequence();
  272. auto requests = ReadSequence();
  273. FixedSet set;
  274. set.Initialize(numbers);
  275. PrintRequestsResponse(PerformRequests(requests, set));
  276.  
  277. return 0;
  278. }
  279.  
Advertisement
Add Comment
Please, Sign In to add comment