Skip to content

Commit d1c1cd3

Browse files
author
Hamid Gasmi
committedMay 3, 2020
#158 is completed
1 parent 0f81bce commit d1c1cd3

File tree

4 files changed

+37
-27
lines changed

4 files changed

+37
-27
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,59 @@
11
# python3
22
import sys
33
import suffix_tree
4-
import queue
54
from collections import namedtuple
5+
import threading
66

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):
99

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)
1512

1613
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
1916
right_part = False
20-
for child in suffix_tree.nodes[node]:
17+
for child in st.nodes[node]:
2118

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
2421
continue
2522

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)
2724
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
2828

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
3232

3333
if not right_part:
34+
shortest_substr_end = -1
3435
shortest_substr_len = 0
35-
elif shortest_substr_len == 0:
36-
shortest_substr_len = 1
3736

38-
return (shortest_substr_start, shortest_substr_len, right_part)
37+
return (shortest_substr_end, shortest_substr_len, right_part)
3938

4039
def solve (p, q):
4140
pq_text = p + "#" + q + "$"
42-
43-
suffixTree = suffix_tree.Suffix_Tree(pq_text)
44-
#print(suffixTree.nodes)
4541

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)
4944

50-
if __name__ == "__main__":
45+
return st.text[ shortest_substr_end - shortest_substr_len + 1 : shortest_substr_end + 1 ]
46+
47+
def main():
5148
p = sys.stdin.readline ().strip ()
5249
q = sys.stdin.readline ().strip ()
5350

5451
ans = solve (p, q)
5552
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+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
AAAAC
2+
AAAAA
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
AAAAC
2+
ACAAA
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
AAACAAA
2+
ACAGATA

0 commit comments

Comments
 (0)