classSolution{long[]h,p;publicStringlongestDupSubstring(String s){int len = s.length();
h =newlong[len+2];
p =newlong[len+2];
p[0]=1;intP=1313131;for(int i =0; i < len; i++){
p[i+1]= p[i]*P;
h[i+1]= h[i]*P+ s.charAt(i);}int left =0, right = len -1;String result ="";while(left <= right){int mid =(left + right +1)>>>1;String temp =isChildren(s,mid);if(!temp.isEmpty()){
left = mid +1;}else{
right = mid -1;}
result = temp.length()> result.length()? temp : result;}return result;}publicStringisChildren(String s,int k){String result ="";int len = s.length();Set<Long> dictionary =newHashSet<>();for(int i =0; i + k <= len; i++){int j = i + k ;long hash = h[j]- h[i]* p[j-i];if(dictionary.contains(hash)){
result = s.substring(i,j);return result;}
dictionary.add(hash);}return"";}}