Advertisement
neronv2

Untitled

Dec 7th, 2015
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <map>
  5. #include <string>
  6. using namespace std;
  7.  
  8. class Node
  9. {
  10. public:
  11.     int a;
  12.     int c;
  13.    
  14.     Node(){}
  15.  
  16.     Node *left, *right;
  17.     Node(Node *L, Node *R) // конструктор принимающий ссылки на левого и правого сына
  18.     {
  19.         left = L;
  20.         right = R;
  21.         a = L->a + R->a;
  22.     }
  23.  
  24. };
  25. void print(Node* root, unsigned k = 0) //функция вывода k отвечает за отступы чем дальше тем больше
  26. {
  27. if (root != NULL)
  28.     {
  29.     print(root->left, k + 3);
  30.     for (unsigned i = 0; i < k; i++)
  31.         {
  32.         cout << " ";
  33.         }
  34.     if (root->c) cout << root->a << " (" << root->c << ")" << endl; // если есть буква выводить букву, если нет то число
  35.     else cout << root->a << endl;
  36.     print(root->right, k + 3);
  37.     }
  38. }
  39.  
  40. struct MyCompare
  41. {
  42.     bool operator()(Node* l, Node* r) const
  43.     {
  44.         return l->a < r->a;
  45.     }
  46. };
  47. vector<bool> code; // глобальные переменные бульного типа томушо ток 0 и 1
  48. map<char, vector<bool> > table; // собсна ассоциация символа с code
  49. void BuildTable(Node *root)
  50. {
  51.     if (root->left != NULL) // если слева не ноль ставим в вектор нолик
  52.     {
  53.         code.push_back(0);
  54.         BuildTable(root->left); // и запускаем рекурсию для левого сыны
  55.     }
  56.  
  57.     if (root->right != NULL)
  58.     {
  59.         code.push_back(1);
  60.         BuildTable(root->right);
  61.     }
  62.  
  63.     if (root->c) table[root->c] = code;  // если нашли букву то ассоциируем ее с кодом
  64.  
  65.     code.pop_back();
  66. }
  67. int main ()
  68. {
  69.     string s = "iiiiiasdsada dasda dadasd";
  70.     map<char, int> m; //создаем ассоциативный массив чар и инт
  71.    
  72.     for (int i = 0; i < s.length();i++) //считаем кол-во вхождения каждого символа(в цикле проходимся от нуля до конца строки)
  73.     {
  74.         char c = s[i]; //в ц записываем символ и считаем
  75.         m[c]++ ;
  76.     }
  77.  
  78.     list<Node*> t;
  79.     map<char, int>::iterator i;                 // с помощью интератора кладем массив в список
  80.     for (i = m.begin(); i != m.end(); ++i)
  81.     {
  82.         Node *p = new Node; //создаем указатель на Node, тупо проходимся по map и загружаем Nodы
  83.         p->c = i->first;
  84.         p->a = i->second;
  85.         t.push_back(p); //и указатель на это дело кидаем в list
  86.     }
  87.     while (t.size() != 1) // сортирую убираю 1 е два эл та и на его мето кладу созданый 3 на основе их
  88.     {
  89.         t.sort(MyCompare()); // cортирую
  90.         Node *SonL = t.front(); // Беру 1 эл, присваиваю его 1 эл ту в списке
  91.         t.pop_front(); // этот 1 эл удаляем, на его место становиться второй
  92.         Node *SonR = t.front(); // теперь этот же который на 1м месте его тоже удаляем
  93.         t.pop_front();
  94.         Node *parent = new Node(SonL, SonR); // создаю батьку a = a + a2 его лефт будет указателем на первый а райт на второй
  95.         t.push_back(parent);
  96.     }
  97.     Node *root = t.front(); //Вершина дерева
  98.     BuildTable(root);
  99.     for (int i = 0; i < s.length();i++)
  100.     {
  101.         char c = s[i];
  102.         vector<bool> x = table[c];
  103.         for (int n = 0; n < x.size(); n++)
  104.             cout << x[n];
  105.     }
  106.                            
  107.     // print(root);
  108.     system("pause");
  109.     return 0;
  110.  
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement