|
1 | 1 | # python3
|
2 | 2 | import sys
|
3 | 3 | import suffix_tree
|
4 |
| -import queue |
5 | 4 | from collections import namedtuple
|
| 5 | +import threading |
6 | 6 |
|
7 |
| -Edge = namedtuple('Edge', ['parent', 'node', 'start', 'len']) |
8 |
| -max_len = 2001 |
| 7 | +# DFS traversal on the tree |
| 8 | +def dfs_non_shared_substring(st, node): |
9 | 9 |
|
10 |
| -# BFS traversal on the tree |
11 |
| -def dfs_non_shared_substring(suffix_tree, node): |
12 |
| - |
13 |
| - if len(suffix_tree.nodes[node]) == 0: |
14 |
| - return (node, 0, False) |
| 10 | + if len(st.nodes[node]) == 0: |
| 11 | + return (-1, 0, False) |
15 | 12 |
|
16 | 13 | text_len = (len(suffix_tree.text) - 2) // 2
|
17 |
| - shortest_substr_start = 0 |
18 |
| - shortest_substr_len = max_len |
| 14 | + shortest_substr_end = 0 |
| 15 | + shortest_substr_len = 2001 |
19 | 16 | right_part = False
|
20 |
| - for child in suffix_tree.nodes[node]: |
| 17 | + for child in st.nodes[node]: |
21 | 18 |
|
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 |
| 19 | + if st.nodes[node][child].start >= text_len: |
| 20 | + right_part = True if st.nodes[node][child].start > text_len else right_part |
24 | 21 | continue
|
25 | 22 |
|
26 |
| - (substr_start, substr_len, subright_part) = dfs_non_shared_substring(suffix_tree, child) |
| 23 | + (substr_end, substr_len, subright_part) = dfs_non_shared_substring(suffix_tree, child) |
27 | 24 | right_part = True if subright_part else right_part
|
| 25 | + |
| 26 | + candidate_len = 1 if substr_len == 0 else st.nodes[node][child].len + substr_len |
| 27 | + candidate_end = st.nodes[node][child].start if substr_end == -1 else substr_end |
28 | 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 |
| 29 | + if shortest_substr_len > candidate_len: |
| 30 | + shortest_substr_end = candidate_end |
| 31 | + shortest_substr_len = candidate_len |
32 | 32 |
|
33 | 33 | if not right_part:
|
| 34 | + shortest_substr_end = -1 |
34 | 35 | shortest_substr_len = 0
|
35 |
| - elif shortest_substr_len == 0: |
36 |
| - shortest_substr_len = 1 |
37 | 36 |
|
38 |
| - return (shortest_substr_start, shortest_substr_len, right_part) |
| 37 | + return (shortest_substr_end, shortest_substr_len, right_part) |
39 | 38 |
|
40 | 39 | def solve (p, q):
|
41 | 40 | pq_text = p + "#" + q + "$"
|
42 |
| - |
43 |
| - suffixTree = suffix_tree.Suffix_Tree(pq_text) |
44 |
| - #print(suffixTree.nodes) |
45 | 41 |
|
46 |
| - (shortest_substr_start, shortest_substr_len, right_part) = dfs_non_shared_substring(suffixTree, 0) |
47 |
| - |
48 |
| - return suffixTree.text[ shortest_substr_start : shortest_substr_start + shortest_substr_len ] |
| 42 | + st = suffix_tree.Suffix_Tree(pq_text) |
| 43 | + (shortest_substr_end, shortest_substr_len, right_part) = dfs_non_shared_substring(st, 0) |
49 | 44 |
|
50 |
| -if __name__ == "__main__": |
| 45 | + return st.text[ shortest_substr_end - shortest_substr_len + 1 : shortest_substr_end + 1 ] |
| 46 | + |
| 47 | +def main(): |
51 | 48 | p = sys.stdin.readline ().strip ()
|
52 | 49 | q = sys.stdin.readline ().strip ()
|
53 | 50 |
|
54 | 51 | ans = solve (p, q)
|
55 | 52 | sys.stdout.write (ans + '\n')
|
| 53 | + |
| 54 | +if __name__ == "__main__": |
| 55 | + |
| 56 | + sys.setrecursionlimit(10**7) |
| 57 | + threading.stack_size(2**30) |
| 58 | + threading.Thread(target=main()).start() |
| 59 | + |
0 commit comments