2
public String longestDupSubstring(String s) {3
long[] e = new long[s.length() + 1];6
long M = 957689076713L;7
for (int i = 0; i < e.length; i++) {11
int lo = 0, hi = s.length(), st = 0, end = 0;13
int mid = (lo + hi + 1) >> 1;14
Set<Long> seen = new HashSet<>();17
for (int i = 0; i < s.length() && !ok; i++) {18
hash = (hash * p + s.charAt(i)) % M;20
hash = (hash - e[mid] * (s.charAt(i - mid)) % M + M) % M;22
if (i >= mid - 1 && !seen.add(hash)) {34
return lo == 0 ? "" : s.substring(st, end + 1);