Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <string >
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7.  
  8. using namespace std;
  9.  
  10. #define ll long long
  11.  
  12. string s = "";
  13.  
  14. struct node;
  15. struct edge;
  16.  
  17. struct edge {
  18. ll left;
  19. ll right;
  20. node * to = nullptr;
  21. };
  22.  
  23. struct node {
  24. map < char, edge > next;
  25. };
  26.  
  27.  
  28.  
  29. void add(node * root, ll left, ll right){
  30. node * now = root;
  31. ll n = s.size();
  32. for (int i = left; i < right; i++){
  33. ll first_id = i;
  34. if (now->next.find(s[i]) != now->next.end()){
  35. ll l = now->next[s[i]].left;
  36. ll r = now->next[s[i]].right;
  37. ll j;
  38. for (j = l; j < r; j++){
  39. if (s[i] == s[j]){
  40. i++;
  41. }
  42. else {
  43. break;
  44. }
  45. }
  46.  
  47. if (j == r){
  48. now = now->next[s[first_id]].to;
  49. i--;
  50. continue;
  51. }
  52.  
  53. node * q = new node;
  54.  
  55. q->next[s[j]].to = now->next[s[first_id]].to;
  56. q->next[s[j]].left = j;
  57. q->next[s[j]].right = r;
  58.  
  59. root->next[s[first_id]].to = q;
  60. root->next[s[first_id]].right = j;
  61.  
  62. q->next[s[i]].to = new node;
  63. q->next[s[i]].left = i;
  64. q->next[s[i]].right = n;
  65. break;
  66.  
  67.  
  68. }
  69. else {
  70. now->next[s[i]].to = new node;
  71. now->next[s[i]].left = i;
  72. now->next[s[i]].right = right;
  73. break;
  74. }
  75. }
  76. }
  77.  
  78. long long num = 1;
  79.  
  80. void dfs(node * root){
  81. cout << num << endl;
  82. for (auto elem : root->next){
  83. cout << elem.first << " " << elem.second.left << " " << elem.second.right << endl;
  84. }
  85. cout << endl;
  86. for (auto elem : root->next){
  87. num++;
  88. dfs(root->next[elem.first].to);
  89. }
  90. }
  91.  
  92. int main(){
  93. ll n;
  94. cin >> n;
  95. node * borh = new node;
  96. for (int i = 0; i < n; i++){
  97. string x;
  98. cin >> x;
  99. ll l = s.size();
  100. s += x;
  101. ll r = s.size();
  102. add(borh, l , r);
  103. }
  104.  
  105. cout << s << endl;
  106.  
  107. dfs(borh);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement