Advertisement
Guest User

Untitled

a guest
May 26th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. const int MXn = 1000000;
  9.  
  10. struct ver {
  11. int l, r, pP, lk, dser;
  12. map<char, int> next;
  13.  
  14. ver(int l = 0, int r = 0, int pP = -1)
  15. : l(l), r(r), pP(pP), lk(-1) {}
  16. int len() { return r - l; }
  17. int &get(char c) {
  18. if (!next.count(c)) next[c] = -1;
  19. return next[c];
  20. }
  21. };
  22. ver t[MXn];
  23. int size_;
  24.  
  25. struct stt {
  26. int v, pos;
  27. stt(int v, int pos) : v(v), pos(pos) {}
  28. };
  29. stt ptr(0, 0);
  30.  
  31. stt go(stt st, int l, int r, string& s) {
  32. while (l < r)
  33. if (st.pos == t[st.v].len()) {
  34. st = stt(t[st.v].get(s[l]), 0);
  35. if (st.v == -1) return st;
  36. }
  37. else {
  38. if (s[t[st.v].l + st.pos] != s[l])
  39. return stt(-1, -1);
  40. if (r - l < t[st.v].len() - st.pos)
  41. return stt(st.v, st.pos + r - l);
  42. l += t[st.v].len() - st.pos;
  43. st.pos = t[st.v].len();
  44. }
  45. return st;
  46. }
  47.  
  48. int split(stt st, string& s) {
  49. if (st.pos == t[st.v].len())
  50. return st.v;
  51. if (st.pos == 0)
  52. return t[st.v].pP;
  53. ver v = t[st.v];
  54. int id = size_++;
  55. t[id] = ver(v.l, v.l + st.pos, v.pP);
  56. t[v.pP].get(s[v.l]) = id;
  57. t[id].get(s[v.l + st.pos]) = st.v;
  58. t[st.v].pP = id;
  59. t[st.v].l += st.pos;
  60. return id;
  61. }
  62.  
  63. int get_lk(int v, string& s) {
  64. if (t[v].lk != -1) return t[v].lk;
  65. if (t[v].pP == -1) return 0;
  66. int to = get_lk(t[v].pP, s);
  67. return t[v].lk = split(go(stt(to, t[to].len()), t[v].l + (t[v].pP == 0), t[v].r, s), s);
  68. }
  69.  
  70. void tree_extend(string& s, int pos) {
  71. for (;;) {
  72. stt nptr = go(ptr, pos, pos + 1, s);
  73. if (nptr.v != -1) {
  74. ptr = nptr;
  75. return;
  76. }
  77.  
  78. int sered = split(ptr, s);
  79. int last = size_++;
  80. t[last] = ver(pos, s.length(), sered);
  81. t[sered].get(s[pos]) = last;
  82.  
  83. ptr.v = get_lk(sered, s);
  84. ptr.pos = t[ptr.v].len();
  85. if (!sered) break;
  86. }
  87. }
  88.  
  89.  
  90.  
  91. void set_dser(int idx, int& dser)
  92. {
  93. t[idx].dser = dser;
  94. if (t[idx].next.size() > 0)
  95. {
  96. for (map<char, int>::iterator it = t[idx].next.begin(), it_end = t[idx].next.end(); it != it_end; it++)
  97. {
  98. dser++;
  99. set_dser(it->second, dser);
  100. }
  101. }
  102. }
  103.  
  104. void print_subtree(int idx)
  105. {
  106. cout << t[idx].pP << ' ' << t[idx].l << ' ' << t[idx].r << endl;
  107. for (map<char, int>::iterator it = t[idx].next.begin(), it_end = t[idx].next.end(); it != it_end; it++)
  108. print_subtree(it->second);
  109. }
  110.  
  111. void print_tree()
  112. {
  113. cout << size_ << endl;
  114. for (map<char, int>::iterator it = t[0].next.begin(), it_end = t[0].next.end(); it != it_end; it++)
  115. print_subtree(it->second);
  116. }
  117.  
  118.  
  119. int main()
  120. {
  121. string s;
  122. cin >> s;
  123.  
  124. size_ = 1;
  125. for (int i = 0; i < s.length(); ++i)
  126. tree_extend(s, i);
  127. int dser = 0;
  128. vector<map<char, int>::iterator> v;
  129. int idx = 0;
  130. map<char, int>::iterator it;
  131. bool flag = true;
  132. while (1)
  133. {
  134. if (flag)
  135. {
  136. t[idx].dser = dser;
  137. dser++;
  138. it = t[idx].next.begin();
  139. }
  140. if (it != t[idx].next.end())
  141. {
  142. flag = true;
  143. v.push_back(it);
  144. idx = it->second;
  145. }
  146. else
  147. {
  148. if (v.size() == 0)
  149. break;
  150. it = v.back();
  151. v.pop_back();
  152. it++;
  153. flag = false;
  154. idx = t[idx].pP;
  155. }
  156. }
  157. idx = 0;
  158. flag = true;
  159.  
  160.  
  161. cout << size_ << endl;
  162. while (1)
  163. {
  164. if (flag)
  165. {
  166. if (idx)
  167. cout << t[t[idx].pP].dser << ' ' << t[idx].l << ' ' << t[idx].r << endl;
  168. it = t[idx].next.begin();
  169. }
  170. if (it != t[idx].next.end())
  171. {
  172. flag = true;
  173. v.push_back(it);
  174. idx = it->second;
  175. }
  176. else
  177. {
  178. if (v.size() == 0)
  179. break;
  180. it = v.back();
  181. v.pop_back();
  182. it++;
  183. flag = false;
  184. idx = t[idx].pP;
  185. }
  186. }
  187.  
  188.  
  189. return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement