1
+ # Runtime: 5273 ms (Top 38.81%) | Memory: 47.1 MB (Top 89.55%)
2
+
1
3
class Solution :
2
4
def longestCommonSubpath (self , n , paths ) -> int :
3
5
def get_common_subpath_hashes (k ):
@@ -10,10 +12,10 @@ def get_subpath_hashes(path):
10
12
else :
11
13
yield hash
12
14
if i < len (path ):
13
- hash = ((hash - coeff * path [i - k ])* n + path [i ]) % mod
15
+ hash = ((hash - coeff * path [i - k ])* n + path [i ]) % mod
14
16
return reduce (set .intersection , (set (get_subpath_hashes (p )) for p in paths ))
15
-
16
- # can be replaced with a pre-computed large prime
17
+
18
+ # can be replaced with a pre-computed large prime
17
19
mod = self ._generate_large_prime (int (1e18 ), int (9e18 ))
18
20
low , high = 1 , min (len (p ) for p in paths )+ 1
19
21
while low < high :
@@ -23,7 +25,7 @@ def get_subpath_hashes(path):
23
25
else :
24
26
high = mid
25
27
return high - 1
26
-
28
+
27
29
def _generate_large_prime (self , lower , upper ):
28
30
"""Generate a prime between [lower, upper)"""
29
31
def is_prime (n , trials = 50 ):
@@ -40,4 +42,4 @@ def witness(a, n):
40
42
while u % 2 == 0 :
41
43
t , u = t + 1 , u >> 1
42
44
return not any (witness (randrange (1 , n ), n ) for _ in range (trials ))
43
- return next (r for r in iter (lambda : randrange (lower , upper ), None ) if is_prime (r ))
45
+ return next (r for r in iter (lambda : randrange (lower , upper ), None ) if is_prime (r ))
0 commit comments