Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <queue>
  7. #include <set>
  8.  
  9. using namespace std;
  10. using ll = long long;
  11.  
  12. struct vertex {
  13. int left = -1;
  14. int right = -1;
  15. bool leaf = 0;
  16. int p = -1;
  17. int pch = 0;
  18. int link = -1;
  19. int go[2];
  20. vertex(){
  21. go[0] = go[1] = -1;
  22. }
  23. };
  24.  
  25. vector<vector<int>> g;
  26. vector<vertex> gr;
  27.  
  28. void add_string(const string & s) {
  29. int v = 0;
  30. for (int i = 0; i < s.size(); ++i) {
  31. if (s[i] == '1') {
  32. if (gr[v].right == -1) {
  33. vertex new_vert;
  34. new_vert.p = v;
  35. new_vert.pch = 1;
  36. gr.push_back(new_vert);
  37. gr[v].right = gr.size() - 1;
  38. }
  39. } else if (gr[v].left == -1) {
  40. vertex new_vert;
  41. new_vert.p = v;
  42. new_vert.pch = 0;
  43. gr.push_back(new_vert);
  44. gr[v].left = gr.size() - 1;
  45. }
  46. if (s[i] == '1') {
  47. v = gr[v].right;
  48. } else {
  49. v = gr[v].left;
  50. }
  51. }
  52. if (s.size() > 0) {
  53. gr[v].leaf = true;
  54. }
  55. }
  56.  
  57. int go (int v, int c);
  58.  
  59. int get_link (int v) {
  60. if (gr[v].link == -1) {
  61. if (v == 0 || gr[v].p == 0) {
  62. gr[v].link = 0;
  63. } else {
  64. gr[v].link = go(get_link(gr[v].p), gr[v].pch);
  65. }
  66. }
  67. if (v != 0) {
  68. g[gr[v].link].push_back(v);
  69. }
  70. return gr[v].link;
  71. }
  72.  
  73. int go (int v, int c) {
  74. if (gr[v].go[c] == -1) {
  75. if (c == 0 && gr[v].left != -1) {
  76. gr[v].go[c] = gr[v].left;
  77. } else if (c == 1 && gr[v].right != -1) {
  78. gr[v].go[c] = gr[v].right;
  79. } else {
  80. if (!v) {
  81. gr[v].go[c] = 0;
  82. } else {
  83. gr[v].go[c] = go(get_link(v), c);
  84. }
  85. }
  86. }
  87. return gr[v].go[c];
  88. }
  89.  
  90. const int MAXN = 1e5 + 1488;
  91.  
  92. bool used[MAXN];
  93.  
  94. void BFS() {
  95. queue<int> q;
  96. g.resize(gr.size());
  97. for (int i = 0; i < gr.size(); ++i) {
  98. int tmp = get_link(i);
  99. if (gr[i].leaf) {
  100. used[i] = true;
  101. q.push(i);
  102. }
  103. }
  104. while (!q.empty()) {
  105. int cur = q.front();
  106. q.pop();
  107. for (int i = 0; i < g[cur].size(); ++i) {
  108. int to = g[cur][i];
  109. if (!used[to]) {
  110. q.push(to);
  111. used[to] = 1;
  112. gr[to].leaf = 1;
  113. }
  114. }
  115. }
  116. }
  117.  
  118. int usedd[MAXN];
  119.  
  120. void DFS(int v);
  121.  
  122. void DFS_SON(int son) {
  123. if (son != -1) {
  124. if (usedd[son] == 1) {
  125. cout << "TAK";
  126. exit(0);
  127. }
  128. if (!usedd[son]) {
  129. DFS(son);
  130. }
  131. }
  132. }
  133.  
  134. void DFS(int v) {
  135. if (gr[v].leaf) {
  136. usedd[v] = 2;
  137. return;
  138. }
  139. usedd[v] = 1;
  140. int rson = gr[v].right;
  141. DFS_SON(rson);
  142. int lson = gr[v].left;
  143. DFS_SON(lson);
  144. usedd[v] = 2;
  145. }
  146.  
  147. int main() {
  148. int n;
  149. cin >> n;
  150. vertex root;
  151. gr = {root};
  152. for (int i = 0; i < n; ++i) {
  153. string s;
  154. cin >> s;
  155. add_string(s);
  156. }
  157. BFS();
  158. for (int i = 0; i < gr.size(); ++i) {
  159. int pr = gr[i].left * gr[i].right;
  160. if (pr) {
  161. if (gr[i].right == -1) {
  162. gr[i].right = go(i, 1);
  163. }
  164. if (gr[i].left == -1) {
  165. gr[i].left = go(i, 0);
  166. }
  167. }
  168. }
  169. DFS(0);
  170. cout << "NIE";
  171. return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement