Skip to content

Commit 2324ef3

Browse files
committed
feat: add solutions to lc problem: No.1923
No.1923: Longest Common Subpath
1 parent 638869e commit 2324ef3

File tree

3 files changed

+60
-60
lines changed

3 files changed

+60
-60
lines changed

solution/1900-1999/1923.Longest Common Subpath/README.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -78,41 +78,41 @@
7878
```python
7979
class Solution:
8080
def longestCommonSubpath(self, n: int, paths: List[List[int]]) -> int:
81-
def get(l, r, h):
82-
return (h[r] - h[l - 1] * p[r - l + 1]) % mod
83-
84-
def check(l):
81+
def check(k: int) -> bool:
8582
cnt = Counter()
86-
for k, path in enumerate(paths):
83+
for h in hh:
8784
vis = set()
88-
for i in range(len(path) - l + 1):
89-
j = i + l - 1
90-
x = get(i + 1, j + 1, hh[k])
85+
for i in range(1, len(h) - k + 1):
86+
j = i + k - 1
87+
x = (h[j] - h[i - 1] * p[j - i + 1]) % mod
9188
if x not in vis:
9289
vis.add(x)
9390
cnt[x] += 1
94-
return max(cnt.values()) == len(paths)
91+
return max(cnt.values()) == m
9592

93+
m = len(paths)
94+
mx = max(len(path) for path in paths)
9695
base = 133331
9796
mod = 2**64 + 1
98-
p = [0] * 100010
97+
p = [0] * (mx + 1)
9998
p[0] = 1
10099
for i in range(1, len(p)):
101-
p[i] = (p[i - 1] * base) % mod
100+
p[i] = p[i - 1] * base % mod
102101
hh = []
103102
for path in paths:
104-
h = [0] * (len(path) + 10)
105-
for j, c in enumerate(path):
106-
h[j + 1] = (h[j] * base) % mod + c
103+
k = len(path)
104+
h = [0] * (k + 1)
105+
for i, x in enumerate(path, 1):
106+
h[i] = h[i - 1] * base % mod + x
107107
hh.append(h)
108-
left, right = 0, min(len(path) for path in paths)
109-
while left < right:
110-
mid = (left + right + 1) >> 1
108+
l, r = 0, min(len(path) for path in paths)
109+
while l < r:
110+
mid = (l + r + 1) >> 1
111111
if check(mid):
112-
left = mid
112+
l = mid
113113
else:
114-
right = mid - 1
115-
return left
114+
r = mid - 1
115+
return l
116116
```
117117

118118
### **Java**

solution/1900-1999/1923.Longest Common Subpath/README_EN.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,41 +60,41 @@
6060
```python
6161
class Solution:
6262
def longestCommonSubpath(self, n: int, paths: List[List[int]]) -> int:
63-
def get(l, r, h):
64-
return (h[r] - h[l - 1] * p[r - l + 1]) % mod
65-
66-
def check(l):
63+
def check(k: int) -> bool:
6764
cnt = Counter()
68-
for k, path in enumerate(paths):
65+
for h in hh:
6966
vis = set()
70-
for i in range(len(path) - l + 1):
71-
j = i + l - 1
72-
x = get(i + 1, j + 1, hh[k])
67+
for i in range(1, len(h) - k + 1):
68+
j = i + k - 1
69+
x = (h[j] - h[i - 1] * p[j - i + 1]) % mod
7370
if x not in vis:
7471
vis.add(x)
7572
cnt[x] += 1
76-
return max(cnt.values()) == len(paths)
73+
return max(cnt.values()) == m
7774

75+
m = len(paths)
76+
mx = max(len(path) for path in paths)
7877
base = 133331
7978
mod = 2**64 + 1
80-
p = [0] * 100010
79+
p = [0] * (mx + 1)
8180
p[0] = 1
8281
for i in range(1, len(p)):
83-
p[i] = (p[i - 1] * base) % mod
82+
p[i] = p[i - 1] * base % mod
8483
hh = []
8584
for path in paths:
86-
h = [0] * (len(path) + 10)
87-
for j, c in enumerate(path):
88-
h[j + 1] = (h[j] * base) % mod + c
85+
k = len(path)
86+
h = [0] * (k + 1)
87+
for i, x in enumerate(path, 1):
88+
h[i] = h[i - 1] * base % mod + x
8989
hh.append(h)
90-
left, right = 0, min(len(path) for path in paths)
91-
while left < right:
92-
mid = (left + right + 1) >> 1
90+
l, r = 0, min(len(path) for path in paths)
91+
while l < r:
92+
mid = (l + r + 1) >> 1
9393
if check(mid):
94-
left = mid
94+
l = mid
9595
else:
96-
right = mid - 1
97-
return left
96+
r = mid - 1
97+
return l
9898
```
9999

100100
### **Java**
Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
11
class Solution:
22
def longestCommonSubpath(self, n: int, paths: List[List[int]]) -> int:
3-
def get(l, r, h):
4-
return (h[r] - h[l - 1] * p[r - l + 1]) % mod
5-
6-
def check(l):
3+
def check(k: int) -> bool:
74
cnt = Counter()
8-
for k, path in enumerate(paths):
5+
for h in hh:
96
vis = set()
10-
for i in range(len(path) - l + 1):
11-
j = i + l - 1
12-
x = get(i + 1, j + 1, hh[k])
7+
for i in range(1, len(h) - k + 1):
8+
j = i + k - 1
9+
x = (h[j] - h[i - 1] * p[j - i + 1]) % mod
1310
if x not in vis:
1411
vis.add(x)
1512
cnt[x] += 1
16-
return max(cnt.values()) == len(paths)
13+
return max(cnt.values()) == m
1714

15+
m = len(paths)
16+
mx = max(len(path) for path in paths)
1817
base = 133331
1918
mod = 2**64 + 1
20-
p = [0] * 100010
19+
p = [0] * (mx + 1)
2120
p[0] = 1
2221
for i in range(1, len(p)):
23-
p[i] = (p[i - 1] * base) % mod
22+
p[i] = p[i - 1] * base % mod
2423
hh = []
2524
for path in paths:
26-
h = [0] * (len(path) + 10)
27-
for j, c in enumerate(path):
28-
h[j + 1] = (h[j] * base) % mod + c
25+
k = len(path)
26+
h = [0] * (k + 1)
27+
for i, x in enumerate(path, 1):
28+
h[i] = h[i - 1] * base % mod + x
2929
hh.append(h)
30-
left, right = 0, min(len(path) for path in paths)
31-
while left < right:
32-
mid = (left + right + 1) >> 1
30+
l, r = 0, min(len(path) for path in paths)
31+
while l < r:
32+
mid = (l + r + 1) >> 1
3333
if check(mid):
34-
left = mid
34+
l = mid
3535
else:
36-
right = mid - 1
37-
return left
36+
r = mid - 1
37+
return l

0 commit comments

Comments
 (0)