Advertisement
Guest User

Untitled

a guest
May 31st, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. using namespace std;
  2. #include<iostream>
  3. #include<bitset>
  4. #include <iomanip>
  5.  
  6. const int maxHex = 1048574;
  7.  
  8. void ProcessInput(bitset<maxHex> &bs)                       // Параметърът bitset bs e указател ( & )
  9. {
  10.     unsigned int x = 0;                                     // Използва се за съхранение на един намерен hex
  11.     char c[5];                                              // Масив от 5 символа, в който ще пазим 1 hex
  12.  
  13.     while (true) {
  14.         for (int i = 0; i < 5; ++i) {
  15.             cin >> c[i];                                    // Вземаме 1 символ от входа
  16.             if(c[i] =='.')                                  // Стигнахме ли края?
  17.                 return;
  18.         }
  19.         std::string str(c, c + sizeof c / sizeof c[0]);     // Да запишем масива от символи в string
  20.         x = stoul(str, nullptr, 16);                        // Да превърнем стринга в hex/int
  21.         bs[x] = !bs[x];                                     // Обръщаме стойноста на bool/bit ( ако е 1/true - да стане 0/false и vice versa )
  22.     }
  23. }
  24.  
  25. int main()
  26. {
  27.  
  28.     // Идеята на тази имплементация е:
  29.     // 1. Създаваме и запълваме с 0/false битове, които по брой са равни на максималното шестнайсетично число - fffff
  30.     // 2. Всеки път когато намерим във входа число, инвертеаме бита, който отговаря на него, тоест при първото намиране,
  31.     //   този бит ще стане 1/true, при второто - 0/false и т.н. От условието знаем, че всички hex, ще се срещат четен брой пъти.
  32.     //   Единствено "DNA of the leader is unique" и ще го срещнем само веднъж.
  33.     //   Тоест ако започнем със всички битове сетнати на 0, и винаги когато намерим ново hex число обръщаме неговата стойност (от 0 на 1 или от 1 на 0),
  34.     //   то в края ще имаме само 1 единствена единица - ДНК на лидера.
  35.  
  36.  
  37.     cin.sync_with_stdio(false);                             // disables the synchronization between the C and C++ standard streams
  38.     cout.sync_with_stdio(false);                            // keep in mind that synchronized C++ streams are thread-safe, but this is not
  39.    
  40.     bitset<maxHex> bs;                                      // Това е все едно масив от bool или bit. Инициализираме го с максимум елементи.
  41.    
  42.     ProcessInput(bs);                                       // Приемаме и обработваме входящия string                                          
  43.  
  44.     for (unsigned int i = 0; i < maxHex ; i ++)             // Да намерим лидера
  45.         if(bs[i]) {
  46.             cout <<  setw(5) << setfill('0') << hex << i;   // setw(5) и setfill('0') са за да запълним до общо 5 нули нашия хекс. Примерно ако е 1 - да стане 00001
  47.             break;
  48.         }
  49.  
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement