vadimk772336

типо итог

Nov 25th, 2021
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.14 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. using namespace std;
  9.  
  10. int rand()
  11. { // NOLINT
  12. throw std::runtime_error("Don't use rand");
  13. }
  14.  
  15. const int p = 2 * 1e9 + 11;
  16. const int c = 3;
  17.  
  18. std::random_device rand_dev;
  19. std::mt19937 generator(rand_dev());
  20.  
  21. int rand_int(int min, int max)
  22. {
  23. std::uniform_int_distribution<int> distr(min, max);
  24. return distr(generator);
  25. }
  26.  
  27. long long int uni_hash(long long int a, long long int b, int m, int key)
  28. {
  29. return ((a * key + b) % p) % m;
  30. }
  31.  
  32. struct vertex
  33. {
  34. bool visited = false;
  35. vector<struct adj_vertex> adj_list;
  36. int list_size = 0;
  37. long long int label = -1;
  38. };
  39.  
  40. struct adj_vertex
  41. {
  42. int idx;
  43. int edge_value;
  44. };
  45.  
  46. class Graph
  47. {
  48. vertex* G;
  49. int size;
  50.  
  51. public:
  52. Graph(int n);
  53. int get_size();
  54. void addEdge(int i, int j, int key_idx);
  55. void print_graph();
  56. void DFS(int v_idx, int value, bool& flag);
  57. bool is_correct();
  58. long long int get_label(int number_vertex);
  59. };
  60.  
  61. Graph::Graph(int n)
  62. {
  63. G = new vertex[n];
  64. size = n;
  65. }
  66.  
  67. long long int Graph::get_label(int number_vertex)
  68. {
  69. return G[number_vertex].label;
  70. }
  71.  
  72. int Graph::get_size()
  73. {
  74. return this->size;
  75. }
  76.  
  77. void Graph::addEdge(int i, int j, int key_idx)
  78. {
  79.  
  80. if (i < 0 || j < 0)
  81. {
  82. cout << "Передана вершина с отриц. индексом - ошибка! \n";
  83. }
  84.  
  85. // cout << "addEdge by :" << i << " " << j << " " << key_idx << endl;
  86.  
  87. adj_vertex tmp;
  88. tmp.idx = j;
  89. tmp.edge_value = key_idx;
  90.  
  91. G[i].adj_list.push_back(tmp);
  92.  
  93. tmp.idx = i;
  94. G[j].adj_list.push_back(tmp);
  95.  
  96. G[i].list_size++;
  97. G[j].list_size++;
  98. }
  99.  
  100.  
  101. void Graph::print_graph()
  102. {
  103. cout << "\n print:" << endl;
  104. for (int i = 0; i < size; i++)
  105. {
  106. cout << "visited = " << G[i].visited << "; i= " << i << "; ";
  107. cout << " label = " << G[i].label << " : ";
  108. int size = G[i].adj_list.size();
  109.  
  110. cout << "idx =: ";
  111. for (int j = 0; j < size; ++j)
  112. {
  113. cout << G[i].adj_list[j].idx << " ";
  114. }
  115.  
  116.  
  117. cout << "; edge_value =: ";
  118. for (int j = 0; j < size; ++j)
  119. {
  120. cout << G[i].adj_list[j].edge_value << " ";
  121. }
  122. cout << endl;
  123. }
  124. }
  125.  
  126. void Graph::DFS(int v_idx, int value, bool& flag) //мб лучше не по указателю по индексу
  127. {
  128.  
  129. if (flag)
  130. {
  131. G[v_idx].visited = true;
  132. G[v_idx].label = value;
  133.  
  134. vertex u;
  135. vector<struct adj_vertex> curr_list = G[v_idx].adj_list;
  136. int u_idx, val, edge_value;
  137.  
  138. for (int i = 0; i < G[v_idx].list_size; ++i)
  139. {
  140.  
  141. u_idx = curr_list[i].idx;
  142. u = G[u_idx];
  143. edge_value = curr_list[i].edge_value;
  144.  
  145. if (!(u.visited))
  146. {
  147. val = edge_value - value;
  148. DFS(u_idx, val, flag);
  149. }
  150.  
  151. if (((G[u_idx].label + G[v_idx].label) % (this->size)) != edge_value)
  152. {
  153. flag = false;
  154. }
  155. }
  156. }
  157. }
  158.  
  159.  
  160. bool Graph::is_correct()
  161. {
  162.  
  163. bool flag = true;
  164. for (int i = 0; i < this->size; ++i)
  165. {
  166. if (!G[i].visited)
  167. DFS(i, 0, flag);
  168. if (!flag)
  169. return false;
  170. }
  171. return true;
  172. }
  173.  
  174. class FixedSet
  175. {
  176. int count_numbers;
  177. int size;
  178. long long int a1, a2, b1, b2;
  179. vector<int> table;
  180. vector<int> A;
  181.  
  182. public:
  183. FixedSet();
  184. void Initialize(const vector<int>& numbers);
  185. bool Contains(int number) const;
  186. void print();
  187. };
  188.  
  189.  
  190. FixedSet::FixedSet()
  191. {
  192. this->count_numbers = 0;
  193. this->size = 0;
  194. }
  195.  
  196. void FixedSet::Initialize(const vector<int>& numbers)
  197. {
  198.  
  199.  
  200. this->count_numbers = numbers.size(); //Число чисел для хранения
  201. this->size = (this->count_numbers) * c; //Размер графа
  202.  
  203. int n = this->count_numbers;
  204. int m = this->size;
  205.  
  206. for (int i = 0; i < n; ++i)
  207. table.push_back(numbers[i]);
  208.  
  209. cout << "n,m,p = " << n << " " << m << " " << p << endl;
  210.  
  211. this->table.resize(m);
  212. this->A.resize(m);
  213.  
  214. int a, b;
  215. long long int alpha_k, beta_k;
  216.  
  217. bool flag = false;
  218.  
  219. cout << "Сейчас зайду в вайл" << endl;
  220. while (!flag)
  221. {
  222. cout << "Зашёл" << endl;
  223. Graph g(m);
  224.  
  225. a1 = rand_int(1, p - 1);
  226. b1 = rand_int(0, p - 1);
  227. a2 = rand_int(1, p - 1);
  228. b2 = rand_int(0, p - 1);
  229. cout << "Сгенерил а б а б " << a1 << " " << b1 << " " << a2 << " " << b1 << endl;
  230.  
  231. for (int i = 0; i < n; ++i)
  232. {
  233. alpha_k = uni_hash(a1, b1, m, numbers[i]);
  234. beta_k = uni_hash(a2, b2, m, numbers[i]);
  235.  
  236. cout << "i: " << i << " alpha_k, beta_k : " << alpha_k << " " << beta_k << endl;
  237. g.addEdge(alpha_k, beta_k, i);
  238. }
  239.  
  240. //Граф построен, осталось проверить что он корректный. Вызову DFS и он ответит yes or no
  241. cout << "Граф построен, осталось проверить что он корректный" << endl;
  242. // g.print_graph();
  243.  
  244. if (g.is_correct())
  245. {
  246. cout << "correct!" << endl;
  247. flag = true;
  248. this->a1 = a1;
  249. this->a2 = a2;
  250. this->b1 = b1;
  251. this->b2 = b2;
  252. g.print_graph();
  253.  
  254. cout << "\n запишу А" << endl;
  255.  
  256. for (int i = 0; i < m; ++i)
  257. {
  258. this->A[i] = g.get_label(i);
  259. // cout << "A[" << i << "] = " << this->A[i] << "; ";
  260. }
  261. }
  262. }
  263. }
  264.  
  265. bool FixedSet::Contains(int number) const
  266. {
  267. int m = this->size;
  268. int hash1 = uni_hash(this->a1, this->b1, m, number);
  269. int hash2 = uni_hash(this->a2, this->b2, m, number);
  270.  
  271. int idx = (A[hash1] + A[hash2]) % m;
  272.  
  273. if (0 <= idx < m)
  274. return (this->table[idx] == number);
  275.  
  276. return false;
  277. }
  278.  
  279. std::vector<int> ReadSequence()
  280. {
  281. size_t size;
  282. std::cin >> size;
  283. std::vector<int> sequence(size);
  284. for (auto& current : sequence)
  285. {
  286. std::cin >> current;
  287. }
  288. return sequence;
  289. }
  290.  
  291. std::vector<bool> PerformRequests(const std::vector<int>& requests, const FixedSet& set)
  292. {
  293. std::vector<bool> request_answers;
  294. request_answers.reserve(requests.size());
  295. for (int request : requests)
  296. {
  297. request_answers.push_back(set.Contains(request));
  298. }
  299. return request_answers;
  300. }
  301.  
  302. void PrintRequestsResponse(const std::vector<bool>& request_answers)
  303. {
  304. for (bool answer : request_answers)
  305. {
  306. std::cout << (answer ? "Yes" : "No") << "\n";
  307. }
  308. }
  309.  
  310. void RunTests();
  311.  
  312. int main(int argc, char** argv)
  313. {
  314. std::ios::sync_with_stdio(false);
  315. auto numbers = ReadSequence();
  316. auto requests = ReadSequence();
  317. FixedSet set;
  318. set.Initialize(numbers);
  319. PrintRequestsResponse(PerformRequests(requests, set));
  320.  
  321. return 0;
  322. }
  323.  
Advertisement
Add Comment
Please, Sign In to add comment