|
5 | 5 | from collections import namedtuple
|
6 | 6 |
|
7 | 7 | Edge = namedtuple('Edge', ['parent', 'node', 'start', 'len'])
|
| 8 | +max_len = 2001 |
8 | 9 |
|
9 | 10 | # BFS traversal on the tree
|
10 |
| -def non_shared_substring(suffix_tree, len_text): |
| 11 | +def dfs_non_shared_substring(suffix_tree, node): |
11 | 12 |
|
12 |
| - fifo = queue.Queue() |
13 |
| - edge = Edge(-1, 0, 0, 0) |
14 |
| - fifo.put(edge) |
15 |
| - |
16 |
| - while not fifo.empty(): |
17 |
| - |
18 |
| - parent_edge = fifo.get() |
19 |
| - node = parent_edge.node |
20 |
| - parent = parent_edge.parent |
21 |
| - |
22 |
| - right_part = False |
23 |
| - end_left_part = True |
24 |
| - for child in suffix_tree.nodes[node]: |
25 |
| - |
26 |
| - child_edge = suffix_tree.nodes[node][child] |
27 |
| - |
28 |
| - right_part = True if child_edge.start > len_text else right_part |
29 |
| - end_left_part = end_left_part if child_edge.start == len_text else False |
30 |
| - |
31 |
| - if child_edge.start >= len_text: |
32 |
| - continue |
33 |
| - |
34 |
| - current_len = 0 if parent == -1 else suffix_tree.nodes[parent][node].len |
35 |
| - edge = Edge(node, child, parent_edge.start, current_len + parent_edge.len) |
36 |
| - fifo.put(edge) |
37 |
| - |
38 |
| - if len(suffix_tree.nodes[node]) == 0: |
39 |
| - print("Over here 2") |
40 |
| - edge = Edge(parent, node, parent_edge.start, parent_edge.len + 1) |
41 |
| - break |
| 13 | + if len(suffix_tree.nodes[node]) == 0: |
| 14 | + return (node, 0, False) |
| 15 | + |
| 16 | + text_len = (len(suffix_tree.text) - 2) // 2 |
| 17 | + shortest_substr_start = 0 |
| 18 | + shortest_substr_len = max_len |
| 19 | + right_part = False |
| 20 | + for child in suffix_tree.nodes[node]: |
| 21 | + |
| 22 | + if suffix_tree.nodes[node][child].start >= text_len: |
| 23 | + right_part = True if suffix_tree.nodes[node][child].start > text_len else right_part |
| 24 | + continue |
| 25 | + |
| 26 | + (substr_start, substr_len, subright_part) = dfs_non_shared_substring(suffix_tree, child) |
| 27 | + right_part = True if subright_part else right_part |
| 28 | + |
| 29 | + if shortest_substr_len > suffix_tree.nodes[node][child].len + substr_len: |
| 30 | + shortest_substr_start = suffix_tree.nodes[node][child].start |
| 31 | + shortest_substr_len = 1 if substr_len == 0 else suffix_tree.nodes[node][child].len + substr_len |
| 32 | + |
| 33 | + if not right_part: |
| 34 | + shortest_substr_len = 0 |
| 35 | + elif shortest_substr_len == 0: |
| 36 | + shortest_substr_len = 1 |
42 | 37 |
|
43 |
| - elif (not right_part) and end_left_part: |
44 |
| - print("Over here 1: ", suffix_tree.nodes[node]) |
45 |
| - edge = Edge(parent, node, parent_edge.start, parent_edge.len) |
46 |
| - break |
| 38 | + return (shortest_substr_start, shortest_substr_len, right_part) |
47 | 39 |
|
48 |
| - return suffix_tree.text[edge.start:edge.start + edge.len] |
49 |
| - |
50 | 40 | def solve (p, q):
|
51 | 41 | pq_text = p + "#" + q + "$"
|
52 | 42 |
|
53 | 43 | suffixTree = suffix_tree.Suffix_Tree(pq_text)
|
54 |
| - print(suffixTree.nodes) |
| 44 | + #print(suffixTree.nodes) |
55 | 45 |
|
56 |
| - result = non_shared_substring(suffixTree, len(p)) |
| 46 | + (shortest_substr_start, shortest_substr_len, right_part) = dfs_non_shared_substring(suffixTree, 0) |
57 | 47 |
|
58 |
| - return result |
| 48 | + return suffixTree.text[ shortest_substr_start : shortest_substr_start + shortest_substr_len ] |
59 | 49 |
|
60 | 50 | if __name__ == "__main__":
|
61 | 51 | p = sys.stdin.readline ().strip ()
|
|
0 commit comments