Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #pragma comment(linker,"/STACK:1000000000")
  2. #include <vector>
  3. #include <string>
  4. #include <map>
  5. #include <cstring>
  6. #include <queue>
  7. #include <iostream>
  8. #include <fstream>
  9. #include <algorithm>
  10. #include <cmath>
  11.  
  12. using namespace std;
  13.  
  14. int nextInt() {
  15.     int x;
  16.     scanf("%d", &x);
  17.     return x;
  18. }
  19.  
  20. char inp[10000];
  21. string nextString() {
  22.     scanf("%s", inp);
  23.     return inp;
  24. }
  25.  
  26. double nextDouble() {
  27.     double x;
  28.     scanf("%lf", &x);
  29.     return x;
  30. }
  31.  
  32. bool final[1100000];
  33. int trie[1100000][2];
  34. int trieSize = 0;
  35.  
  36. int newNode() {
  37.     trie[trieSize][0] = -1;
  38.     trie[trieSize][1] = -1;
  39.     ++trieSize;
  40.     return trieSize - 1;
  41. }
  42.  
  43. void deleteNode() {
  44.     --trieSize;
  45. }
  46.  
  47. bool add(int v, int len, string &s, bool added) {
  48.     if (final[v]) {
  49.         return false;
  50.     }
  51.     if (len == 0) {
  52.         final[v] = true;
  53.         return added;
  54.     }
  55.     for (int i = 0; i < 2; ++i) {
  56.         bool wasAdded = false;
  57.         if (trie[v][i] == -1) {
  58.             trie[v][i] = newNode();
  59.             wasAdded = true;
  60.         }
  61.         s += '0' + i;
  62.         if (add(trie[v][i], len - 1, s, added | wasAdded)) {
  63.             return true;
  64.         }
  65.         s.erase(--s.end());
  66.         if (wasAdded) {
  67.             deleteNode();
  68.         }
  69.     }
  70.     return false;
  71. }
  72.  
  73. int main() {
  74.     int n = nextInt();
  75.     vector<int> len(n);
  76.     for (int i = 0; i < n; ++i) {
  77.         len[i] = nextInt();
  78.     }
  79.     vector<int> a(len);
  80.     map<int, vector<string> > res;
  81.     sort(a.begin(), a.end());
  82.     newNode();
  83.     for (int i = 0; i < n; ++i) {
  84.         string s;
  85.         if (!add(0, a[i], s, false)) {
  86.             printf("NO\n");
  87.             return 0;
  88.         }
  89.         res[a[i]].push_back(s);
  90.     }
  91.     printf("YES\n");
  92.     for (int i = 0; i < n; ++i) {
  93.         printf("%s\n", res[len[i]].back().c_str());
  94.         res[len[i]].pop_back();
  95.     }
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement