Boundary update without `+1` / `-1`
Wrong move: Setting `lo = mid` or `hi = mid` can stall and create an infinite loop.
Usually fails on: Two-element ranges never converge.
Fix: Use `lo = mid + 1` or `hi = mid - 1` where appropriate.
Break down a hard problem into reliable checkpoints, edge-case handling, and complexity trade-offs.
Given a string s, consider all duplicated substrings: (contiguous) substrings of s that occur 2 or more times. The occurrences may overlap.
Return any duplicated substring that has the longest possible length. If s does not have a duplicated substring, the answer is "".
Example 1:
Input: s = "banana" Output: "ana"
Example 2:
Input: s = "abcd" Output: ""
Constraints:
2 <= s.length <= 3 * 104s consists of lowercase English letters.Problem summary: Given a string s, consider all duplicated substrings: (contiguous) substrings of s that occur 2 or more times. The occurrences may overlap. Return any duplicated substring that has the longest possible length. If s does not have a duplicated substring, the answer is "".
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Binary Search · Sliding Window
"banana"
"abcd"
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1044: Longest Duplicate Substring
class Solution {
private long[] p;
private long[] h;
public String longestDupSubstring(String s) {
int base = 131;
int n = s.length();
p = new long[n + 10];
h = new long[n + 10];
p[0] = 1;
for (int i = 0; i < n; ++i) {
p[i + 1] = p[i] * base;
h[i + 1] = h[i] * base + s.charAt(i);
}
String ans = "";
int left = 0, right = n;
while (left < right) {
int mid = (left + right + 1) >> 1;
String t = check(s, mid);
if (t.length() > 0) {
left = mid;
ans = t;
} else {
right = mid - 1;
}
}
return ans;
}
private String check(String s, int len) {
int n = s.length();
Set<Long> vis = new HashSet<>();
for (int i = 1; i + len - 1 <= n; ++i) {
int j = i + len - 1;
long t = h[j] - h[i - 1] * p[j - i + 1];
if (vis.contains(t)) {
return s.substring(i - 1, j);
}
vis.add(t);
}
return "";
}
}
// Accepted solution for LeetCode #1044: Longest Duplicate Substring
func longestDupSubstring(s string) string {
base, n := 131, len(s)
p := make([]int64, n+10)
h := make([]int64, n+10)
p[0] = 1
for i := 0; i < n; i++ {
p[i+1] = p[i] * int64(base)
h[i+1] = h[i]*int64(base) + int64(s[i])
}
check := func(l int) string {
vis := make(map[int64]bool)
for i := 1; i+l-1 <= n; i++ {
j := i + l - 1
t := h[j] - h[i-1]*p[j-i+1]
if vis[t] {
return s[i-1 : j]
}
vis[t] = true
}
return ""
}
left, right := 0, n
ans := ""
for left < right {
mid := (left + right + 1) >> 1
t := check(mid)
if len(t) > 0 {
left = mid
ans = t
} else {
right = mid - 1
}
}
return ans
}
# Accepted solution for LeetCode #1044: Longest Duplicate Substring
class Solution:
def longestDupSubstring(self, s: str) -> str:
def check(l):
vis = set()
for i in range(n - l + 1):
t = s[i : i + l]
if t in vis:
return t
vis.add(t)
return ''
n = len(s)
left, right = 0, n
ans = ''
while left < right:
mid = (left + right + 1) >> 1
t = check(mid)
ans = t or ans
if t:
left = mid
else:
right = mid - 1
return ans
// Accepted solution for LeetCode #1044: Longest Duplicate Substring
struct Solution;
use std::collections::HashMap;
const MOD: u64 = 1_000_000_007;
const P: u64 = 26;
impl Solution {
fn longest_dup_substring(s: String) -> String {
let mut lo = 0;
let mut hi = s.len();
let mut res = "".to_string();
let s: Vec<char> = s.chars().collect();
let n = s.len();
while lo < hi {
let mid = (lo + hi + 1) / 2;
if let Some(s) = Self::exist(mid, &s, n) {
res = s;
lo = mid;
} else {
hi = mid - 1;
}
}
res
}
fn exist(size: usize, s: &[char], n: usize) -> Option<String> {
let mut pos: HashMap<u64, usize> = HashMap::new();
let mut hash: u64 = 0;
let mut pn: u64 = 1;
for i in 0..size {
hash *= P;
hash += (s[i] as u8 - b'a') as u64;
hash %= MOD;
pn *= P;
pn %= MOD;
}
pos.insert(hash, size);
for i in size..n {
hash *= P;
hash += (s[i] as u8 - b'a') as u64;
hash += MOD;
hash -= (pn * (s[i - size] as u8 - b'a') as u64) % MOD;
hash %= MOD;
if let Some(end) = pos.insert(hash, i + 1) {
if s[end - size..end] == s[i + 1 - size..=i] {
return Some(s[i + 1 - size..=i].iter().copied().collect::<String>());
}
}
}
None
}
}
#[test]
fn test() {
let s = "banana".to_string();
let res = "ana".to_string();
assert_eq!(Solution::longest_dup_substring(s), res);
let s = "abcd".to_string();
let res = "".to_string();
assert_eq!(Solution::longest_dup_substring(s), res);
let s = "ababdaebdabedeabbdddbcebaccececbccccebbcaaabaadcadccddaedaacaeddddeceedeaabbbbcbacdaeeebaabdabdbaebadcbdebaaeddcadebedeabbbcbeadbaacdebceebceeccddbeacdcecbcdbceedaeebdaeeabccccbcccbceabedaedaacdbbdbadcdbdddddcdebbcdbcabbebbeabbdccccbaaccbbcecacaebebecdcdcecdeaccccccdbbdebaaaaaaeaaeecdecedcbabedbabdedbaebeedcecebabedbceecacbdecabcebdcbecedccaeaaadbababdccedebeccecaddeabaebbeeccabeddedbeaadbcdceddceccecddbdbeeddabeddadaaaadbeedbeeeaaaeaadaebdacbdcaaabbacacccddbeaacebeeaabaadcabdbaadeaccaecbeaaabccddabbeacdecadebaecccbabeaceccaaeddedcaecddaacebcaecebebebadaceadcaccdeebbcdebcedaeaedacbeecceeebbdbdbaadeeecabdebbaaebdddeeddabcbaaebeabbbcaaeecddecbbbebecdbbbaecceeaabeeedcdecdcaeacabdcbcedcbbcaeeebaabdbaadcebbccbedbabeaddaecdbdbdccceeccaccbdcdadcccceebdabccaebcddaeeecddddacdbdbeebdabecdaeaadbadbebecbcacbbceeabbceecaabdcabebbcdecedbacbcccddcecccecbacddbeddbbbadcbdadbecceebddeacbeeabcdbbaabeabdbbbcaeeadddaeccbcdabceeabaacbeacdcbdceebeaebcceeebdcdcbeaaeeeadabbecdbadbebbecdceaeeecaaaedeceaddedbedbedbddbcbabeadddeccdaadaaeaeeadebbeabcabbdebabeedeeeccadcddaebbedadcdaebabbecedebadbdeacecdcaebcbdababcecaecbcbcdadacaebdedecaadbaaeeebcbeeedaaebbabbeeadadbacdedcbabdaabddccedbeacbecbcccdeaeeabcaeccdaaaddcdecadddabcaedccbdbbccecacbcdecbdcdcbabbeaacddaeeaabccebaaaebacebdcdcbbbdabadeebbdccabcacaacccccbadbdebecdaccabbecdabdbdaebeeadaeecbadedaebcaedeedcaacabaccbbdaccedaedddacbbbdbcaeedbcbecccdbdeddcdadacccdbcdccebdebeaeacecaaadccbbaaddbeebcbadceaebeccecabdadccddbbcbaebeaeadacaebcbbbdbcdaeadbcbdcedebabbaababaacedcbcbceaaabadbdcddadecdcebeeabaadceecaeccdeeabdbabebdcedceaeddaecedcdbccbbedbeecabaecdbba".to_string();
let res = "aeeebaabd".to_string();
assert_eq!(Solution::longest_dup_substring(s), res);
let s = "shabhlesyffuflsdxvvvoiqfjacpacgoucvrlshauspzdrmdfsvzinwdfmwrapbzuyrlvulpalqltqshaskpsoiispneszlcgzvygeltuctslqtzeyrkfeyohutbpufxigoeagvrfgkpefythszpzpxjwgklrdbypyarepdeskotoolwnmeibkqpiuvktejvbejgjptzfjpfbjgkorvgzipnjazzvpsjxjscekiqlcqeawsdydpsuqewszlpkgkrtlwxgozdqvyynlcxgnskjjmdhabqxbnnbflsscammppnlwyzycidzbhllvfvheujhnxrfujwmhwiamqplygaujruuptfdjmdqdndyzrmowhctnvxryxtvzzecmeqdfppsjczqtyxlvqwafjozrtnbvshvxshpetqijlzwgevdpwdkycmpsehxtwzxcpzwyxmpawwrddvcbgbgyrldmbeignsotjhgajqhgrttwjesrzxhvtetifyxwiyydzxdqvokkvfbrfihslgmvqrvvqfptdqhqnzujeiilfyxuehhvwamdkkvfllvdjsldijzkjvloojspdbnslxunkujnfbacgcuaiohdytbnqlqmhavajcldohdiirxfahbrgmqerkcrbqidstemvngasvxzdjjqkwixdlkkrewaszqnyiulnwaxfdbyianmcaaoxiyrshxumtggkcrydngowfjijxqczvnvpkiijksvridusfeasawkndjpsxwxaoiydusqwkaqrjgkkzhkpvlbuqbzvpewzodmxkzetnlttdypdxrqgcpmqcsgohyrsrlqctgxzlummuobadnpbxjndtofuihfjedkzakhvixkejjxffbktghzudqmarvmhmthjhqbxwnoexqrovxolfkxdizsdslenejkypyzteigpzjpzkdqfkqtsbbpnlmcjcveartpmmzwtpumbwhcgihjkdjdwlfhfopibwjjsikyqawyvnbfbfaikycrawcbkdhnbwnhyxnddxxctwlywjcisgqfsctzatdgqqauuvgclicdrpjcphysqdjaflpdbmvnhqggixxzcmpsysbwfkzwxzjictnngufpqhcxlbkodyrqlfomlkiefbmcfenugzqnyqqvgpxonmizkpjdlaqyyowjagzkzrzvcrupfyofeftyfvoqorzvxphhdhydnqiyiczfcgzsecxzsoaobwrixcajabjnvtoerzwayjowahrmuixmmkbtchogfizmvbjnpespxngxjxntohzatlpkcmpphmewevpteharnszafbpbexrvnbedieojezdhnyooiivhnhakilvkobxepbksnqrtxxuqhalvtjspyvporalbliiwjciamlhttaydhxoelimuorjnfvebjhcocbkrgbguwdncodskzzoqrzgavsbjcippetltqaxjhkqacwlgmsbxezqubyzeznnsoqegkykzlxohvitbmjcxllbrvgdijyovpjyeaojlyxqwnheyblznwoyikhqiutotpfukyqkvatxotulvlqzfcvskdccuixthzqrwymzccosjmjqjigehcnfphjuuybaxxukconatzseljyirycbhucxmwwftulfwfmyqyprlnsmxzyfmgjctgeunuuexhbrbsaaingqxqrjvpuhbvcmyztmkgenhonajrkzfrqjinjrbmjyinhwvlcmmxvbgvjgfmaoliosmxbonvlzoiqvkxxtoposygcgkcotohcrauivxxvmrghuauadwojxjligrgstczirnvhqpzwgjbvqzlkxltqnqrfxieggnuriytavbnouwhuamdtlspednyckixkhxedjmotiuucewllthhducwgwmgzxsbkqzfnqfynwisvsctyqdoaiypjivtxkxgoyhwhccklbdjoqykaqzljejlizgbehekmkfetvgfstmypmfnyoundudqlorcogbzoznddfalthwpmiewkmvogmzirbprjftbtffjrkrfminnechitfyfaujgtugadqbrskulsjbaunonxolauvsifevpdyurvfocxtkizflcuvltzuhwyhlbxaphifhtgkfktfnnmocpenrlujsuppbbuorvtubuiyszawzftijwhwgdyubjmmodzybiyunksuixnkariubegpdgctbayaynfskkuyhjvegsjwsbppodvhpjdjlzhxixswdncapxyfjspxeqxdfkhockvrzoisikaymoiqzqbjyoscwegfomlnurwboesfiszetebjblaolnovgvfcpnbemwambkhwcgdbhvkoluhjfxlfrfaeedocdilaboesauplmttewlbojkocklhsbzrtzeyhqtmgroupbzlymupmupsvlkzchclujuozzmngjvktzstsvocxrziuxelruwojzaleyrkjkdleavwqxwgjdbtiywqtdtaamrlcjogxufhgvoqpqkgopbtyqchzhexqgecheahjzxapqjdylzjqhzlzssbjmokncxalgasexztnlzfisxxpeerywlrjdohprewwnlwdbtwmfnnxnoolfhqqxzcvoymdbvmaoliedpvwzyvgyrwjguvoqnxrnaeqwvcfrqkwjmlvxovptultyfuxerelpfgctnpdxluqeruxkxqntosggfjqmrnlnkhhilznpycdrnemnktcsmzufpqgiraphzmgfhevzejhavsypohpttnnowfahpxfwmvxgwfuomxemdkzdlzldesmowzmhwoydnsovwykxqyllbmcurlvtwcfwxvvkxfknwwcwfjkzjtonalgijdsulcfagehiptszrcltbbypopdbmdfkyofelmrdmdbceguyxnkheqqtbletpqmjugpckmjyuuvsbqhyzmposwcgscnishluuhnwkyrkujefpgtsqrmcoortgitpdoagdncxlofkqozgngbtmlyyoyodcmcwetdtltupjrtemrjswekkfjvfecmvagyptjjuwsqpjwlxxosqhpssdvjraaicjfwvesyqfbumjjbqytkinpldxopxjzmvpigmberobyzyxwvwmlmbziduqhmbescgkvhgqtalmaxfsjlysmvrizgvrudstiwmaahtqehfbofvqwgqygvseykmgmhgjbxcrtdjqvojvyhohallyewqelzhjeuqmmsqhkluvqsfmxzbqqokehfoqrlqmwpnwojfowqpqebnuggeuvsszgfywceolvabyvbrwatuyherijsdqvpyyhdyradbammmchqkvdbxpbrxzrpfrsiiezvowrfqejibvociujtcwbygvfwojgfnvvwqlqqgipxhrogppzghtnweodaxuqxknnqnajlnsvheiycsvifvoljsncgnunsqcymnyoeeslrjflpprvtksimffvnuvakskdakvmlkpowfpfzdrcfctikhvvbagrvjlzjydnlmspzyynyjjfxnozpjjgjelipswsmfroitqphzsuqgumlnkxksbzhrsvcnfwufofhurmhksvvfjzggbtgrezkrkqmhduyqgwuwxoxaiifemtwrbilftiuhcgpjvqxldrnlzphdffncevlcyrxlpbwuswjfdegexeoooshdfqtqithpfocyowaqeedikssptyvkabhtaeotcwxccgguuotqvypugpcbwzalxwqbjdcokoxjnqhggpbbfeyjiellsikiqqtxpvzmjsfleepjpbxpeicxfcwbpprzgcrjgjaxshewradetsqsvfmcxptmksecfpynqzpctqpogcgokzrkltsbmwxkmynasohpkzjupapngusnvdjfqezqhyikllgkelewwwhhbdjvxdagnnxscjkotbbmhzkqbjwuwidrnvmztikmqjcxmcpgkoudhydmdvberfuvjnhlnfcsbpzmuquvrgogtfwefhqzkmxxgadtvjpxvurxprbsssihviypclwkjfaatzjxtvlzwaacqlwnqetgkldqaqghuihrgxbbpmjfsvaigqrhiiskkfibaeilqptkdsqqfwxeixuxgkiboaqnuaeutjcydnxyxnmattjrrxmthwvyipgazaxgrrjcvdnyxpktsldhluhicyqprxhljyfhawuvoonrwyklcdlmdvsgqrwqqomisksftsfyeifmupvylkjbagzyctuifbsrugqsbrkvskmundmczltpamhmgqespzgrkxebsvubrlmkwyqhjyljnkeqvdxtjxjvzlrubsiiahciwefwsswgssxmvyvgjrobvubcbgjomqajmotbcgqjudneovfbjtjzwqtsovzshmxeqofssukkvcdwlsdtyplrlgwtehnwvhhegtwkwnqqdiajpcaajsylesadaiflruewhrbrogbujbppunsqgytgnyuhnkejhccavaptbydtqhvyatftxcaaljyhhkkadzdhhzawgndunwwgknnbtqaddpszqgummmnomfqmdxqtwjexsbadfdqhnyixjslsaisscocbabivzokkgiinqqzsrtfpzjmxfkqmuzzlelqjtjidjarkwbwlcqrefokrlwdmuzyffdtajnqoimlzzpcgpjjwlqkusefzbgznhexzojxnzxmmedobgvdabtdoiskozrdrjscxwivaekrkyyfynuktmgyziteavdxfctvkfkrmsdwpaywzbkeojeycwdkectydojttisizruilwokhepscqdnjygiakomkhyujaffxjyxqmvkemqihpcdygprdeaxgjbkonfvgtzayfbmgwsskoyxjlknwwtehhhpjllhkcblyaxnbekoidbbyqvdqqsyfcemylmqskpxifcnhmemkkitqtbfwhmyemkzightkjbhlquticivpeeclpamsqoztxvdtcqbsonxyecnhcadtghkjckhrcdfggnqlwurydzbeybqkcfnnbwkciwaqdzgmcrbltvcuftxsqfpxnoombsbeoqxivgtkrjklxatgcorkdrvmngwlekeopgecefzxtprcoajoopxviijxilxfiwuajsbtcctfcqqgzhyjmonwdbyjlnneidyaqhhothzpzaxcthvbxpdcqofaeamxbqjwhunnqwclhcqhagawjsxygorgbuqryzickyplbaivkabbrkibqzqacabbwmnpndaqvbknbqcjuywxjrdbznndomwbbqfgulwczydrhrocebhygriiwxmwtjjyqqiqrjblxuamddlsiocdoysdaacuovljtpgocephnxuugdyggsnhcqiqhulyhlxiwzvhrtbmvjnhacwunckqzhpcthqgsupptdwkfeprbg".to_string();
let res = "maoli".to_string();
assert_eq!(Solution::longest_dup_substring(s), res);
let s = "baaddcedaabeeebbddcdcdbaedcadbcbedddbbcbcbcdddbdddbdebecedabbdccdabbaaeedcbcacbcdebebaeeecaaddeceabbcaddabeceaceebedcabbcdcdbabdeeeacaceabaaaaeaeabbdecbdebedcedacbecccaeacbadecedbacbcdcebddebabbdddcdbbdccbdaccacaccbaabebcdbeadbdeebddbdddbabbeaeeabbdbcbcaaccdcabaebeadcaddeedcabebcbdbbbcdeeabbbadcbbadddadaddeacdbbbbecdadababacabcceaccdaddbcbbbccbdddacadcddddedeaeabebcdcaccceeecbdcaeebeabedbececeadbdcdcedadbbebedaaeacbedecddcabeddbadaaeceedbbedaadcbdebcbbbdcbeccaadeacdbebaedadadddbebccacecbcecdeeadaebbdbaeeaeebcadcbbedcdddacdeeaaeeeeebdccabbdaecdccaeacbecbdbadccaeeeeaceeabcacebebbccceadebeaeeeeceebaaaecbaccaccbccebeceaecdbbaacaadcecedddbcbacdaecbbddbaedbbbbbeacdeddaecbbdabebaaadceaabdedeadbbdbebbbcedbddaedccedcbebbdbbeaecdaabcdbadbbdbcdcbdeedbcbabebaaaeceebeccddcaaeebbedcdceeeebeaddcdabbcdbebdaabaedbeacccebbccbecaeeacbdaeeccdbdeadcdebbcddaeaebdacdadbecbacbaccdcaddbdcabadcdacadadbdbedadbecacecedccabbceeeeecaeccceedacbaeadacdcddccaeabbcecddddbbabaeeecedbaccabceecbbeedacbbcdddadccedbbcbcadccdddedeceaccdaeedcaebcdadbaededddbebaabdeebacabaaceabdeedabdacbeddadeaeedbddaccaacbababeeaeaecdbdaeabeeedbaeeddbcceecceebabbebebdedbaebbeebddeeccdabaeaecccbeeebacacdbecadabdcdeedeebccababdeeaccbdbbabdecdbdebabdbeeadacbccceebdeddebedbbbcbabdccbddeaceeccbecacdbbaecbbaabebadbbdbababddeccbcebcdbdbcebddaeaedeebacaaaecbdaabdedabcbedadcebbeadbcaadbcdbaeaacddeebcbebbdbecbcdebbcaaaacddebedabdaeeaeeaabbedcdabdceeaaddcbbeadccbcddceedcabbaecabadbadeabdbdcceaedcdbcdaeaebdbdbaacdeccedbaeeabbadaaaecceabceececaacecebabebbdebadeabdaadbbaebeeabebbdbeeccceccdbaceabbbeeecdccebdadeabbeddcdacdbeedbededbbedddabddeacbdbeeedcdeecaebcbabeecadccbedbeaadaebdcabedecdeacaccbeaadabddeadddccccbdcdecebeeceaadbaaabdedadbdccbdeabbdddebebcabbebaaabbbaccecebaecccaadecddbaabeebcabedebdabcbccaeadebabaacddecaccdacaadbbcdbdbdbeddedddebacaeadbaebaddedcebccdbbdcdbcaaaaccdaaceaebdadaceeeabedcacdddeeabecbacdcdbcebabccabecbbeeedbeeccabaeccccceaeaaceebcaacabbbcacdcebabdbcbaeeddaccdeadcbdedeabecdaecadbcbbdbcececbdbcdcbbbbdaacebccbaacbcaaeadbcbeeedaceebaeebadbbcceddbdaedabbdacdeadabeadccadbebcecbcdbaabbecddbaacaccbbbeaeadcebdccbaedaabdadcaebbdcdeaebeecdbbdbaadaedbeecccddacdedcdebbddaeecabebacaacdacdadcecdcaeaeaecbccedabbceebacdedceedeebbbacddacddedbaddaccaebeebeaadbeeeecdcaedadabddebcbcddccadaaadddbdbdccbdebbcededcdabbdbbdbbbedecadbdebebdedeebaadcaebebdececeaabbdaedeebbacecdbcbddeaaabdcbbdbabddabacbdebcbcccebdcccbcddcebdcbededbaadebebedcbebcccdddbabbeecbadcbeeeabbadddbbbcedcebbaabdeceecadaabdeaeabbebabbcedadbddcbedadcaededaedbeaaaeddadddabbeeaddddaaadedccddbcebeadcaebaaeabeeebecccbaddceebceeddabbdddcbeeadbecddebcebebeedcedbeabdbebcccdbbaadbabcbebadbecabbaeccbbeecaeebccdabbdcbadbdacbdccdccebeabceaaecbbeedeaacaddcedccaabaabeaecdadaceacacdcdcadabeacbeeabdcdaeceacdbdccccbbbaebcceaabcbecbabebcaebbbbdeaebbebaeeacbdbaddeaaeacedbdbaedecdbaecbbeddededbadbbadebabecdaadddbadeaabbeaebbaaeeacebcceabaaeabaecbdaeaccbedccceacdaceacceddaccdeddbaccbabdabdbcbeceaadcdaddbadeddbeceacbbebeacecccadcecacbecbacadbaaeaebbabceeddebbcbabbecbdbadcddddcebdabcadbbaeadbeadcceeccbacccbeccbdbaecbbdbeebbebbcbeccebccdcbbabcdaedbaaaaceeebddebdcebaecbadedaaccccabebdadbbcaceabbddeeeebcaebecaaaacaccaacddddcaedcdccbdabbbabbacdabedbbbaecccacadbacbcadabccedcababaedaceebcaccddeecdbcbbcdbbadbbbcccdcbdadbccaacbaeabbaecabccebcddbdbbbccbbcccdebbcabadcaeeecbacadaceeaecddeebeacadeabdabbbcdaeacdebddadbeeedbdbcebedbabbbebeaadabdabebaebaabdcbbceaececabecbdadeecccdebcbecaabbeccaedabbaaddeedaedbdbacdcaccbdbabbdebdebceceddbcddbabeebeecadcabbaedeabebdeeaaebaebaeaaaccbebceedadbcbbbaeceebcaedecbbebddccaadcadccbcababcadacbcabebcbbeecabbeecebeabceddaaeebdbdeeadeeebadbbcaaebcdcdeabaaecababaccaadcdebdeaddcaabaaaaedbadeddecdeaaecaedceabebdcceecdbcbcdaceeacececcadacaebadedebebcbcedcdbcadaddadbbadcebdeacceabaeedecbebbeccbabaaddddacccbddebbcbdedbebcccbbaecceeeccddacccaddecdcbaebdebbbccbdddeadaddacdcebebeedccddedddcbceadbbdddcabddbbbbdbabccbedcacabecabdeccdecebdbbcbdcdcaebbaceededeadcbccdbddbbebeeddbedaeadbdabebdcdbeecdaecbcecedcbeaceacdeebaadeeebaaeecdebeabadbbdbbcbeceebeeecdbdacebdcedbecccabdbaaacbeaecbddcaddbdeeeadeadedabacdeaadaedbdacccbbacadadedecddbcabcebdadeaecbeeaabacaddaeebcbdcabeacbddbecbbbbacbdbbdecebeedbeacdcabcdadcadcbbadaedaddabedbbbbabeddacedbaddcaececbdebeaeeceaecdedccbaadbdabdedbeccaeaddbaaabddbcabcbbbddbedbceddcdbcdbeeebbabbaedcdbdedaccacbddcdbaaadacdaabaeebdcedbdbedeeccaacbdcaaacbacccebcbadeececacbcaaaecccbabecedaebdaebdaecacaebceeddadecedbccdaababccadeeddbbdccecbddbbdacbeaabdaabebdaaebebcbacdccacebccaadaacaacbbaaaaadbdcebabddccebccebdbcbbebeadcbdcbaddcdaceedebdcdabaaeaeccdabadbdeacbaebcbcbadabadacdcebcdeaebddcabccddbababbadddaeaecbedcdeceebdaeebdbbdebabdaeeaedbcbdacdbbcbcaddeaaadcdbcdcacaabecbceabecbccaadaddaaeaccbbacceceddaedcebeccaaabcadaaddeacaebcdbbeeacbaaecddeadddcabbeebecdadbadceadecedccebbbcbdcbbceeedcbdcebaddabbdedceedeeaaabcbcecccadaebdcaeccabaaeebbbbaecbcbccbbacdadebcabbceeddcaebdccaeedcceeddecaaeebeeeadcacbacdaacbbbccdbdecbcaaceddaadacdcecbabdebdececeeecbedacddbaeaecbbcadeecbccccbcedcaddacdeecbaeaadeddcdcbabbabaeadecdcaaaaddbcddbabeeccbdbeaddbeceedbdbdcdcaabebcbacdbedbadbeecbbbdaabcceddcdabbdbdadbdcddeccbebdeaebbbaacceeddcbdadcacdaacebaeccdeacaddcbdbaeadcaaaceadcddeaaedadcadedaedacaaacabcdaaacecdbbabebebdeaadaecdcbbadeeecdbccedeebbddebecadcaeaeacacccecbadedaaeebddaeebbadcedaaadcdbcbcebabeccdddcbdaaadebeddbbdaeaceabecadcdecabdddbcedcdecceacbccbdbcaebbdbaabecedccaaceecbaabbebdeeaceedeadbaacdcebbbabdccaddcecedeebdeadebbacbcadbbcabccddeeccdcbdbcdacecaceddcdbaeececbdcaececdedabcaaaecdccebadedbdbbbdccececaeaebdacaddeacacddccdaccccadbecceaedacaacdabecdbbabecacabdebddcaadeeacccdbabebbbedadebaedeaaeeeaceaabdbccaabeabaaddbeaaadeabaddaabdcebdcebbedadacbeecddbcadbdccbabeeaecdebabdaabbcecdaebecebcaccadceeaaaaeeedbbaddeadacbccadbbeabeedacaddbaadabaebeaeeedbcbeeabebeeeedeaeadeccbbacadadbbceaacaecdcbbbaeacedbabcabddeacadcddaaaddabcccecbbcdaaeaccadbeaabbcdebcebdebdebabdbcdbdceadeccdabbeeaceebaadbdaadbcdeaeadbadcebeeabcbecaeaacbdceccbecadcceeabcabccadcddbdbcaabeadcdbbaeadacbbdddaedbccaadcceaacbaaaacbeaeaebdebdbdeaebcecaceeaebbebcadaadccbccdaedbbdbcceecacddeeadedbedaeddbaccddaecbeaadadcccabbeeabbecebdaacabedceadaebbbbccdccbabbeeebaaedcdecbaeaaaabdabebeacdcecaedbddbbccbcccceaedbeccdcdebaeaccbbdecaeeebcaebbdaacaedeebabecccdcaadecaeadeccedededeaeeddebedcdbeecedaaecdbacdddddeeebebacedabebbbeacbcddaeaeabbbcbcabdabcbdaedabbdbacedbebdcaeebecbacbeaceababecdcdaabaaeadebddeccdaabdececdaeceecabbbeeebceabbbbdebadbcccbcbdbbceeddbbddcbbceeeabbeedbddbdacedddcdabeecbddceabbccbcbededaaaacbeeaecaeccceddebeebeeacdeabbaaedcbedcebcbadaedbaddcaebadadccedeeabdeaeeaeaebaccabbeaebaedccaeadadbeaebbeceddeaecccaaadcabceadbedecddceaaedbeebeacaaebeeadceccddeebcecedaebaedacaedccbaebbedeeacecaceaaddaceaabdaeeeddacecabadabbdebccdccedcdaceeabcdeaeaedbbdeedbdcabecdcaabcaebeeabbbdeedaaecedaabbbaaecadbbbcebaeceaadccdbcaeaddccabcedaabecdeacebabbcdbbbacdbaaeebddeaaedcbccecbdaacaedccbaeaddaddaccccaceecadcadecbcecccabeccabaaceeccbeccbbdddcadbeeaeddcbbbddccacbbccbcdabbbdbbeddaaecddaecaacdcaaadaeccdbdbecededcdcaeadbdbedeeddeccbdbceddabececdaecbacabcedccceebbadeeabddabeceabaeecdaabcedacedbabcbeddddddebaaddecdacbebeadbbebbabeebcecacaebedebedeaeaddbbdbdcbcbcbadcccbddbebcacdebcedbbbacccdbaceacedabdacecdeccaaceaddbbdbeaeadcbadbeccbdccceddbcdbeccabcaaebbdaeccecdbbacbbdccbbededbdeeaeabeedbecadddcbdbcdceedecbaedbbcbabcadbbddabadcdbaeebcaaeeacbbbebbcaecedaebaecdeedcecebeebdabcbecdaecccecbbbbcbacebbaeaadabaadaebabdedcddcbcdddecdaaaaddcdedeceebbaddceeeadbbddaecaadabcedeabbcdddacbccdceeacddebaaacaccdcecbbcabeecdcbaabaececdbdebbcddeeadccddbecebbeaebbcbdddedbecccecacacabbaeababceddcdcaebebaadedddccecbebbbabbbeecddbbabbeeeeceadacadcaadcaedabdcdcacedaddececabbaeaadeebcccbeeeecbcaddacaceceedddabcccddbacbeeecbceeaeddcedaceebacddbcadbbeedaaecbbbecaeadbeaaaddeaeabdceddbbeaceaddaabcbabaecdcbcecdecdaeeeaccacddaaccdbbdeeeceedccbdeeecceaedecbeeaececaecaacbbbdcbcededbbbedbacdddcedbcaaebeaaebaeddeeeddabaddbcbcaeceedebcaacabeecedbacacedddbddcedcddbadadbdaccbbeebdbbaadadbcdeeaaebbacdbdedddcacaebbebbeeecaeacecbaaeccecbcebcdaadeeadcbddcebaeebabeddcddccacbacbceacaccbccbbcdaaebdcbacaebdaabebcaabaaebeddeaeacbcedbccbdebdccadaddacbebceaaabaebbddbcdadbcdcbdeaeecdadcbeabdadecedcdcdcdbeacddeacaaccebacaeddbbcbbdcaedadddebeddbcaeebbcdecbdaaaabcebdedacceadcccbaadedcceeccceabdbcbecccdbcbebcabbbcaebacdbedaaabcddbccadbeddccbeeceaeceacdecadedcabaeecedcbbbcaecdebbacdbdadaedaeacadbebecaaaaebadeedbdcebcecebadebeebddeecbacbadabdcceabebdbaaabaacacbebdddebcaebbbeecbdccbdcabdbddbbbadaceeaeecddcaabadeedeeebbdbbeaecbedbadcbadcecacacdaecbabadcceaadbdcbacbccdeabaabcdbdaaacdaedccbebdcbadccaddbccededeadaddaccaebabcbbdcaedaedccdacbaacecadcdbbaedbcddebadbdaedceebebacdceebeebaadaebeaeabdcbadbbaddbdabaececbaebbcdccedccbadaebdbeecaeedeeceeacdaaccecabeeaedacccccbaacaddacbbcbabbadcccaaabadcabbbadaeeaadacccacedaeecebccabcddeeadacdbaccebdabbaabadbecadadbbadeeebcbddaadececbcebbddebcebbbebccbdbedbdcebacedaeddeddaebcdbdbcbebabdbcbcbbeebaaeeeebcaceacdcdccaedabacddccbbbdabccadbcaaeeeabcbdeccbcbbddbbdaedcddabaccdacebacdccbbecaaeccadabddeaccbeeeecebdeecbceeddadadcacdecacacbddbdacbcdbadbdcddeedcceceecbaeecbcadacbbbabebceaadacceedbdcbcaedbbbaabadbceacccbbbdcbcebecbbabbdababcdbebeedebeabaabeaeaccdcdcecbdebeedbdbaaadbacdadcceeecdbababccbcbdeababbbbbeedbaaaaecccdacdeebdcaadbdcdbcccaabdbbaceceecdddecaeaddccceabadabbedbacdeddeebdceecedbabdcadeaabacaacaacacaeeccdbeebaddddeeececbababdebbadccdbaaedacadaccccceaebecedddebdcdddddeaebecabadecedddaedececddcdcabdcccedceaaececdddbdeddadabdceeaeaacceaedeeccaccedaeacccddabccdacadebcebdbbbbcedeacccdbdcbdcddebbceacbbbcedecabbecbcdcbddcebdebbeeedecbaeacddbcacbcebbbbceabdcceeaeaadeceddcabccbceeaaabebeaedaabecccaeaceacbeddddaaaceaaceceeabebcabededeeaeddedabeaeeaddaadccaeceabaeeadacaceedcbbcecededdecdbaadbecbaeccedaebacbebeecbadcadeadeebcbcbadbecdaebdbccaeaacdcdeadbdbaceacabcbcccbdbdbedeacbbdaebbbcccbeacddadcaeabcaecccbbecadcdddbcdbcbbcbadabaeccedbbcbdbecabcddeacbbeacdcdadecdccdecbdeebadceadbbdabbcedbceabadaaacdddeccbcbddeeceeebbedbcbabdbccdebaaacbbeccccebdbddbacbabbbacacdecbbbcdaacbdcddbabccdeaeeaedeebedbeacddcceecaaadeacdeeeaeaededeadddeddbbacaddbbdbdceceaedceedbaeeadbdbdbeedbadbdacbdecebecaaeebdbadecabbcdeeaccababdcbdaaebdcbbbeabdcbabdecbcbdbcceadabdeabdbbabadcebabeccbbdbabcaeebdaedeebcbacaddeabdbdcbdcbcaecacabbbeaebecbccdacdcdcceeccaeceaedacadecaeaeebbeaebdcbbdcecabbbacebcadbeedeccbaaeebdbeeadceadddeaceadddbbccadccbdbacbddccaceecadbeeddeeecaebbdbeecababcbccccbaedacadcedbbeedabbeaacdeccedeeedaadaddddcebbeeaeaeaecabdbbeaedaaacbecabaaadcdabadddbeaaedbdaaebacbbaaaeaebaedbccbcabaeabcecbeacabecaddeeeaceadcebddccbdcaadcaaacacdeacecbabdaaebdddcdedebacaeadbeecaaebaaacdcebccceddddeceaacaebddaebaeeebddbbabcccadbedcabcdbececacececbcbcebbccbcedbdcecadcbbeebccddaebeeeaddabbcbbbbaaccedcaccbadadcaadbebebaadeaceacbbcacacddcccaababceacdadcaceabcecadeddeacdaacebaabebaebeaceaabddeeccbabbdcacbdacdbdeeacaadddcacbababeeccbbaccccdacdedccdcabbddecacebedaccbbeeabedeadbcadeeaadabceccbeeedbebbbabdbacdadbeabaddceebddebdbabdbdadedcacbbbdbcbbdaacabcadbeddcacacdbcdcbbbbaedbdbcadbbaaedbddbeecabcebbebaedcdcaabdeeccdeeccaeeacabeaaacbdaeabeecaaedabbceebbbdaeeabecdadebcbcddbaaaedceeaeecbeddaaadacdccaacdbbdabaaebccdcbeaedcbeabebaaadadddaadeeededdbebbecaabbdcedebdddaadacbbbcebbccadcbaddccedcedbdebbdddccdcbbbaceaaedbecccceacbeddcebbdeacbeeecbcadcccdabebdbeecbcdaccaacdbdbdabadcabccedcbabeeecceccddcedaaddceaeedcdbebaadcdeaebabaaaedceebccbceaebeeeecbaecbacdcbedabeccaeaeaaddddaaedbebbbbbbabcadcccaabcacacecceeaecddbdabddadccddeaacdbcdceccbebddcabbcbadeccaaddeaebebedacccdceceebaaeceeeddedbaedbbcbaddeddadcbeadbeebdbdebddcacdccccbcceddaabebdcbcabcabaadadabdabadbebebcdcbaedbdeaeeadacacebbeccdeccdadeaacaeccbbbacdecdaebaceadbddcaedabceaebcaaeadaccdabedcedbabbcbbebbeecbaecdcdbadadcebddbdcbeeaccdbcdeeaabdebeaaeedbabcbdbeaaaeededddaedccedeaeecdddabcdededacaabdcccddccacddbdeceadeecbcdcdbadbcdeaeceeadedccceecdabcccccbecedbebcaaccceacbedebeaeaaecdddadeacebbaadcaadbadcbddeddbeedccdeceaebeedbdadbebdbdaceabeeaecebeaaeedabcbbadebbdeeebeaddadaeaacdeacddadcbdaabbddcdedadbebaabccdddcdeeaeecbebdaceadeebceebceddabcadcbcabbaccbcdcadcbeddddcdaddebebcbcdaaddceebcdeeebbccebecdaeeabdadcaadaeeddeeabeaecbccadbbedddbddadeeabdaebbceceabcdebeaeeebebacbdeaeecddddbaecaebeabbcdcdeecdcaeeaeccddbcbedaecebcdddecdbdccbdebeebcebeadaecbbdadbdebcebdadedcedabacdbdbcecebbaedeaceacdacaeaeceaddaceeedeacecaedcecdddaceeadbbdeaccbdbcddeddeebadebdbbedcdebdbcaeaedecdbcecbeceadbdebdadceeadaadcbbcabbeddeccdedcacaebdadeaddccccaedcbcdddbcbededdebcdaebcccaacedbbccdbdccacbdbbedcbcdbedbdbaccaedecdbceadacbdbbcbcdbbbecbcaaceabeccabaabbaddedacbcbbbabcadaabebcbcaeabccdbaaebaedeadcebedaaaabdbcbbdadbbdeadeecbdabcbeceedeeabdcabbaeaeabcebdeddbddaceacbaeabacdacbccbbaeacacbcaeebabadbebdadcacacbbcbabecabaeebbbbbadaabcbcbdaeabedccdebdadcccdabbeebdaeeadbbccddeeababbbbaebeeaaaabdeeeececcbebbacadddbbddbbcadcdaebdcdcacaabdaabcaeedebbbaebcccebccdbbaeeadaaebeeccdbebecebeedecdeaebbcadaccbaddaaabcccaecbdabbbcabbedddcdadebccbbadeabdbdcededbeedaebbdaccedaeaacaacccbdbbdcdbcdcaedbbaabbbecdaddbabababecbbaadecaebbcededbecdcaedbbcceccedcededadbaccdbabaebbacdacebaacbceeaaabcbddcecdaaaedcbdaadcdbcbbacecdbcabcadeaceedabadbbddbaacacceeabaabacbeddebbccbecabeadcecbdbddeaebeabedceababddecbceeeddbbdbbbbeeededaebeebeabbdadeedcaaebdaccecccdaccbcdeaccaabeeaaeeabdccccebacaacdbabdecaecbdecdecbcdccbeaccadaecaeadaaacdeeebbbebbcbbeceacebbbbbdddababcdddddeecebebddedececeaaebcdccbedeadebceeeadcdabebcaaeedeccdabdcbdbdeabaeccbeedcceaccdceabdadecceadcabaaeadceadbbdcaceececdadbdbaababdddedbbdcdabeececaebdeedabdaabcabcdccaebeebacacaedaeabcaaaccaeebbeceabaaaeacaddcceaddbddbcbbbcaedcdceacdebbbceaacacdbeecbcbbdcbaeedeeabcdcbabcccedeadccbbceabdbbeedddacbddcdcbaebebddcbaaebecdabbeaaaddbbbcbeeaddececbeebdaedcdacdcabdeedebaeedbedcecbbbdecddadebcdbaaebecadaeadceadeeaedbcddbedebaaebeeadabeeeadedaadcedcbbbacbadecdeebbedbbdaeaedbaaabbdbbeddaaedcdbdadeebcaeacbbaaeaeaadedcaadddccaaaddcbcbadeeeabbaeeacceaabadecbacbceeadeccaedbaaeeecddddbdabcceadddbaebabbbdbaddcecdaeaeecccbadbdaddceccbcbeaaecacdbabaeccebeebddaceabbcbcaaddbcccdacddcececbbbceccacbbdcaecbebaeaeebceadcacddbaeadadddddbeeccacabecaebaacbaaabbabbaccadcdaaeececdabbcccbaaecaeebddbcbdaccbbbeacaadbddebeddcbbdecaeddbcdbcbdeabdadbcaacebadbaeaedaedecdaccedcedabeabaedbcdeaebabddccabcbadbbdecbcecaaedadacdbcdebeabcdacdbebddcbccadecdbbbebcbeccbadbeeedbbdbdabbbbbbdecbcddadbcebedbdebbadcddebdabddbccedcebbcaeeacacdedccdcebdddaccbbbccabbbeebbdbebdbecedaaabdacddbdedcbabedeabaceccadeedaacddcbbccbcbdcdbabbcdbeeebaabeddcdaebadcecddaadaabecebdbdbbcacaedabadbcecbadcddcebceaebdddeadcbbedcdbedcacbeeadcddeecdbeebbcedbbecceaeeaebacbeeaddbcbbccbeabeabebeeccebcdaacedcabdacdcaabacedcbadcaaabaaaabaeddacacaaeaaabedccebdccacdedbcdadecddabdeadebcdedeabddaebbaaadacadbddeccdbebecacdadbbaadbaedccbeacbaabcbdccddabdbbbbebeacaebecbedebaeadabccdbbcecaeaebcaeeccaceecaaeabdbdbeeadeadcdbddcdaedbccbadaaccccabbcccdedbeeadcabedccddaadedcbcdddedaecbbcbbacbbeabdbebabdaacecbaedbaeacecbcedcbcabdededabeddbdcecbbcaebabdecacdececabcaecdebdaddadbbbaadbecaacbcbebbceccddeeecceecdbeecbadbbadedbbedcdbeceecceddebdabbbcbdceabbadacccbcddedbacadadcdccbbbccbaecbedecedabbbcacdcddcbeccadabebbaccadceadaececcdebcbbadebcbadacdedbdedededbeacaeeecacabbcaeadeacaceaeddaecdecddceccdcecaaecdccaccbbbcbbccabeeabedaebdabaabaadcbcdebabeccdedbbbcadcbcbdaebabdeebbcabacedddbcbdbdbaecaacdadebabaeadbececebeebcdddabbedaeebbecacbeeabddbdcecbeabdcabbdcbebacdabdbbeddecdbbbabacbbbeeccdadcaabbcddebeacaadbecabcaebcedaededeabbccdbadebadabcbcccadeeaacddbedbcbecbbebbeacaaccebecdaabbabcaddceebacaebceebecaaadeedaedaedccdebccbaeaeebacbabecaeaaecbdabaadcbbdabeeebdaabdbbbcaeedceaecbeedededcecebcdaadddeacecbececdecaeeeacebbbcbbabdbbdaecaaacbbdecdbabbaceaabcebcebeddacedecdedabbaadddbaebdcacbcdcdecdeaaeddeaaabbbdcccdccbcbabdcdeaaceecbaedaeeceddbebecdcbbdeeedeebdacbccddbdaecaedbbedaccbecdeaebbdcaceeaccabbadbbebeccceebbdaeccabacaeccbdbcbeebdeadbbeaadadabeabbcdcebaabbbdcdececccbcceaacbcbaeebdeaebcebaeaddabcdddaaddbcecaeaaedaceedaebadbddbadcbbbedecccbabdacbbacecaeebabdebbcdcdedcedadaacbbeeaddaeebcaccdcbdbccebdcaecbeddcbecceabcbdaddacdcddcabcbbabbddcbdddebcbeddbbabbedacceaedbabadcdaaabdcededceddedbccdcddeeeeadcaaccdeddeababcedaaedcdcaccbdbdabcaccceaabddccebadeababeaaccccaaabbbcdacabedbcbeadceecebccbacbdecdbdebbabeeddecdacdacbdaaeccdbeccbdbacbeabcaeedeceeddcedbeebeedacecddecabdabdbdabcadbdacdddcecccbcbcaecacdccecdecabbdadebdaabcacaedecbadbeebecebeacaddaabdeceeeddbdaddbaaebcaaadcaecedbcddcdbccbcddabebdcececdaeebcdccdbacbbaaecdadabdaacdcdbeadcbcecbbebbdbbadbdcebacaedebaeebebbddbccacecddcacebdceeacaeceebeeadcabacacbcbadcdeddecdeecbdacdccacdcceabcbdabeacaacaacbaecdcbadcbbeadebaabacdaecdbeacdacdaaeeedccadaadacdbaeabbedaeadbbbdbeeaeacccebececdbeeebbaeadcceedecebecabadaaeacadbdedbddddcabceccdbdaadceddebdbabeaeadbabbdaceabdbbeaecaecdccecaaceeadeebdeaebdaeaaaadcecdadcaabcdcdaaecbdaebabaeecbbcebeccdaedddcbcdedabeebccacedaddaacecdccabbacbabddccccdbaecaceecaabeeaecccaabbdcaaddcecbeceaaedbdccbecdabbbdabdababaaaacdadbdbebadcebebdbcbbcedecbacecedceaabceaaeedaeabecddaaccdaeaccddeddddebecdedbbcacbbeeababbdaceceaaeadddaddacdecdadbcedcebceeaacbceeeebdbdbcbdebcddabcdabedeebbbddbcadbabdedcdccbecbdceececbcddcbaeeddcceaacaebaddaedebbabcadbbceaeadcaaedaebbbcdedaaebbdbdadedbbbbdabcecdabbebaecbbddebeaecceaabebedecbddcceaecedbadaceccaadcdcbbabacaebecbaccbdadacdedaaacddcaaeeeeedabcbaaecceceeaabbcdedecedbcabbaadcadeabcccaddcecbbaebebceebedaebeddeeeaedabaadcdceddaaadebaabdadaeabbeadbbbaeeadaaadedeeaebbbeccbaeaddaacdbdacaababadccebbbbddcbceabbccccabbccaeaedcccbaeeabddaceabbbecbceaacabaaadaebdaeabcbceeebacdbeccdbaddbbcacbbeadbbddbdaecacbadbacdacacaaacbccebeadeadccbcccceebeeddebaaeabcbececddbccdaddbbbbbadaeaeebeeeccdaaacceaeaaaaabacbdccdccbbebcbdcbacadacebbacdebaedcdeeaddccedcdeabebddccedbabeeaacedcceccaacdbeabecccadcccbccacbacebcdedcedddbeddacddcbbdeaaceaeebbceadbceebcadbbebbbaecedeecaaebddaecebdeebaeeebcdcbebacedaaadaadbbdaedeaedbbbadbecdddbeaaabcccbcccecedaccaedbecbbcdcddebdcceccedacbabaaddbbdeaddccaebabadbaeeebaeadbeebaeeaaabbaaebeceaabeeaebcdbbaeadbbdbacdadbedecdeebeeeaebcbaaacdccacacecabbdbceddddeabeaaaaadaaadcebbaacedcabcdbbcacaccadbbdaebcdedadddccaaabaecebbbccabdabccabebeadebaaebdeaabbcebcbcdaadbaedcbadbcdbbbeccccaaddedbcddebaddbcaabbecccaecbaacaedabcaccaceacecacabdbacdeebaecdaeeebdddeadddeceabbbbacdaaaaeaabdaedbdcdcaadeecedeeddacedebcdebedecbecceecabcdeecbcbbadabedbadbeebbaadcebbbceacccdeabdaaeabdabebbdcbcdeaecdcbcbacdbceaccdeaeaedabdeaabcdcabbbbbbdaaccbabddcbcddbcaacedcdadaaadcbbbbddddeeeeaecddbcbbbdeaaecbcbacdeccecabdcaeaedcdcadbcacbdbeadaeebabacbceabacdcbecbacbdedabacaeddeaadaeaaebcccbdadcdccaedbaddcbaacadbadeeeebbdeccdeeeeabadedeebbcdbdbbecdbeeadeaeeedebcabacebedbceeacbcccbaadacbeeedaaeebbedeedddaebaaaeeaddcddaccbdadbdbbbadebaaecedebddeaedbdebdeddcabbcdcdceabdcdbbabdeddeedcbdbcbbbdcdbddadadeaebbdddaaeddceadcbaececdadcddcbcbebeccdbbbebabaddabeebabeceeededdabaaabacdcdbdaabceccdbbdaceaeedbaccddcaeaccbededecaccbcaebdabcdadbcbbdedcacbeccdacdaabccbabedbeaeaeaabeadeceddbbcdddbeaedcebcccececadaddeeeebbeebcbaeadeadbcddaaaccebdedbddbeeabdaccaaacadebbdacaaebbadeeabbcbbbcbcacaaaecacddbbcbdcdcebbedadcabcccdebabbecabcaebbdcaedbdaddeaecaeebbadceccadddacdeeabdeaeecceccbedbdabdceedcccadbaccaeadecebbecadeeebdaeaebedaeaeeebdddebbaebadacbcbaebebbcdccaeedacaccdeabecabaeccdebaeaeadbeebeacbcbdaaedeebcaddbbdccbdaebdeadabcdbcbaeacadaeaaddececcaabdcceaeeddebdcecedacedaaedacddbbcabdbeaabbddedaebeeeccceeebaecddbcecaecccecdaaddeeaedbdbacbabedbabeeccedcdbbacbabbacbdbaeeddadaabdbaecbdeaaddeacebababcacaecbebdabedeceabdbacdebeadcbeabedacdbedaceadcbeabddecdcccbbebaeebcbaadcdbbddbdccbdcceadaeaceaccecbcebabadcabbeaddcacecbcccbebaeaddbbeebaaaeebbeebdadcdaeebeacedcbeaaadedbcdbbdeeeedaebccacacedaacbebbcccbdbdbbadedbdbadddacabadeabeebeeadedeeadacccdcdeebbebbdeabbbecaadaebddedddeaceebbccdabeeeeaaeacdbecdbbabbcdaacddaeaaaaddcddbcdcdcdaebdadbdaedcdedaaddbadecccbddeeedddbbcadcaeedcbdabbbdbcbbbabaeeceacbdbeeadbeeabdbadbeabbbdaecbeeddbccbceaccbbdabbaedbecabbdadcabcebbbaeebddbcebceaadcadeaedabadbdcbeccedecbceddddaeaebabadadcdbddeecacdbebbdccdbeeaabedccceabecdeedcbedddceedbcccdddcbdebddddbdabaacdabaeedbabaddececeadadaeedddabdbcdcbdeddebbbaaeccdccbaccacbeddeebedeabccdacbaabadebcbdaeceaccaadedaacdbebecccbedcdddecddcaacbbceedadcbdbddaaebebdecbddeeeceaacccabcebdaecbbaeedbdbddddcbecbdddeebecdaacbbdcaaedbbaddedcdcabddbdcbaacaadaabddbceeecbdebaadbbccdecaedbedcbebcdacdcaceaedcebddacbcbaecebcddcbdecaabeaebeddaeddecdbcdeabbdaeedabdccbcadededccccbebcdeacdbdabdcdcbbdbdaabcdedbbdeeebcadeebecbbeedbdebcababdeeaeeecaccacaaeceeabaacbccadceeecccaceaacbcaccdebeaeccdebbdeebcadadcadbceecabdcebebabeaebbaadadadcbcbacdecbebebbaabddcdaeaedcbecaaecabcadcdeadddbadbaccdbbcdbebceceeaabcdbecbcdbadeedaccaecbaeecabeacabbacebceeebebaddeeccdceaacbaacddecadbebadbddbcbaeaeaaccdebadcacddedadeadbbcabccdcceeecbacbccbadaeaaacecebbadadbadeeaabaebcedbeeceaeccceebbdbecbcebceeaaeaebcdcabcaeddacaaacbdedbbaaeebbaabdbdacabecbddaedaddeeeedccecdecdbcccaeecddebbbadbeebcaabccdaaeacabbaddcaceabebedebbddaaaacddedcedcedcbbabaabbaeaeaddbcccdeddacadacacabeebcbabbbbedecccecebbebccadeddacbbacedaebdbcccdcbaccbceeabaedeeaccbaebacdbddaebeecdcaeccddaadedddcadedcbdcecbbaaabcbbeeebaabdeeebbedcdcabaeddcccedaedbddbdbcdadebecacbdaeabebeddabadcbbbedbebbededeccecabaddddedebdebeebccbabcedcddebcccbcbdaaebdcecbeedceededecaedacebaeedaecabeaedaeeadebdccceedbaddeebebddcbcedaacdcaebaccdeabeabcabbdcaecedcbadbcacbbabbdabaedaeaeecdacbeddbcdbadeacbcaacecaabcabcacdbaecbbaebaaabdcedcaabdcebbdedcabdbaaeecbeebddeceddacebadececacccdebbcdecdceadcebacbaabdddeccbedeeaedaeabadbcacaedaacccacaabebcaebeccdabbceddeccdbbeeeccddbaabbaeecddabcbdbeadacaccbbbabeceedaabcbbbaaaedadebaaceabcdcddabeaecaebbaceceeabbebdeaecbccdbcadceebeacaeceaebaecacccdebcabecbecdbaacbeccbcacebdaaceedddedbbbdcdbccddaececadbbbcbddbdbadeccdebacbebababbdedcaceeaeebcdaabdbacccdeabadcdebbaaeaadaebdcaeedacedcaebcaeabdcdababeacbaddaeccceedcaedddbcecacadbacadbcdaeeceeeabbbadcaaaadaebdccabbbadedadbdcdcbccdabeedecadabdedaaacaacdaecbcdbbcaabdcdbebcaccbeecbebcebaadccddebdbdceedccbcbdcecebeabceecbcaddaccaceaccebbdeecddbecdbbadeaedaecceacceeddcacccdeeeecdbbbccaaccecaecaabcccdabdbbaabebdcecbbabaeadddeebacabebceabbdeabbdcabdaebdcecceabaabcbbbadbeeabacebaaeddedaecaccddebebccdbdcabdecbdaeababbcdeccadddbecbebbedecaaecbdbccadbddddaaacecebbbbcbedadbbabcbdccccedcdbdbaaeecacbbecaaccadcdaebdcbededceeedddedabadeadadbcbdceaebcddddebcccdeebbacecaaccadedcbadabdbedcbbebdccbbecacabbdbacdbdecdebcacacdabddbdbbecbcecddcceabebebeeabcdceecedbeddacbcaedaeedabcbdeedabaeecabacddeccdebacdbdeabcebcabeddbdcaebacdcbcbbbbeaeceebadecebaddcdeddccebabdccaadaeadbdadeddcaecacdeaccbdabdcbdbdcdadceeedaecbeeebaaedeaddbdbeabceecbccbebeaceeeaceabddbdbbedabbbdaecaddabdcbddadeccbaeeaecdeaeedaecaacbbaaecabccbcbadeabdcabedbcecbbdedaebedcdbeebedebdcedbbdceeedbbcaabadabcdcabaebacdcbcdcccaceeceddadeaadebceebccbacedbdaceadeacadeecceeaebadceeacaacdedaecaeccdcaaabceeaabdecaabceeaacaadaaddccdbdbadcebeddbbadadbbaaadeadbbbdddebebbbaabcdebbcaeddbbacabdddedeababbabdadeecdabbeecdaeaedcdddcdedebceacaccadcccabadbedaecbeaeebeceacbbbabbcdeadeebaabeeccadddbccaeeddddbbeecaecbdccbeadacdbaedadaeddcaeaedaeaeacdadcedcdabddacededcbeebaabeadaabbeeddeeababbaacabdbeadeadeedceadcbecddacaeaceeebcecadaebdccaeacdedbbecacabddeeeadecddbacddbebeedacdeddacbbbcebbaecaecadccccdebccdcdcbacbcccbdabdadaababdacebddcceddbdecdacbadaaaeaeddeeabcebbccbdbbebedabbdbdcaedebaaecddbacbaaaccdadeddebebdbabeceeaadadaabceecdceadebecacacbaebaebebceccdeebcabedaabcabccabedbbebabaababedeebaabcdaacdcccebcaecceedeebeabeadacbbcdcbbcdbddbcdadbcaceddedabeebbeedaabbccacdacedabbdeacbeebceadcaeacdbceaceaaaeebcbbebdeddbbbeddcbcabaacaadebcdceadcadaececbbbeecddcbbdbcdecaaacedbcbdbeabbbbdeceaebdcddbbebdbebbbcabccaecacbbcaeadcdbcdaadccaceddedaabaabcacacaeddcceadbabdbcbdaeeacabacdcdcbccaedeceacaaadabeabbceeedaabdcdbddebddadbadbbddedecabbbbdabecedbbcceacaacbebdeddbedbeabdbbadbeacbeabceaddadeeececeaaacecaaacbdcdcbcddcecadbbeceadebadececacaeaeccbdbddeadabcebaeeaeeabeccebdaeadaeedddaeaaedabcdbcaaeacabdcaaccbadbeabdbcbdcbeddabdacebcecccddcacbbccedbecbdcdbdeeaaaeeecacbacabbcccccaecacdececaeceacacecbdcbceaedcbdabeecbabbeaadbaaaeceabbaacbbbbddaeeadabaadcadcbeeabececbededccbddcbcdeacaacbabaaaebdcbcecdcbdbbdcbaeeebdaaecccbbbabdaddbdceaaacabdaccaeaccecdadcebdbceddbcbbcebdbbaccedbbeeceaeadbbbaabdaeaeccdcebceebdddaaaaeaeabdbebeddbadbbbddadadadcbccebecccdeeeaaeddaacadbbbbccecbbcdcebeeeaecbedbeecabcdceaeeadaeccecbbcddbacbdbcbbdceeedccbdeadbeeaacaeccaebdabbecabaeecdbdbcacdbcbadcbeeedbcebaacdaccbbcecdbdebabacddddaeadcdddcbedabbcbedcadbabeedeecbadbacbddaccadebcbaadbcbdabedccbbecbbbccabdaeacdaddcdceebedccdaddcdeccacecacbcedaccdbdbcbeeedaabbeddcaaacaceabcecacebcdacecaceabbccccdcbacaeaeebbbbecbecdbcabecccdebacbadcbaeecdcaaabaaecaacdaaccdbaaacdadecadaeecccdacebdddecbaacedbedbcbbbeabdabcdcedadcaebbebaeeebddbebcddabbbdedbeadeaebaccabecdbcbeaaabadbeccccaddbacddacbaeaecccadedaddedbebcecebcdadaccdcbedacbcbdcddceedaebedecdedeaecbeadbccedcbbaedccbeaeebaababeccdbdbdbcddcaaebcbcbaabbdaaabcccbbaeeaabbccddeebadebbdcebdaadbabdcacdeeeacedeaccabcbbeaabcdaecbdacecdabdbabaaadcadcdacaeeccabcaebcdcceaeccbaddecbceccddbbdbbbbadbdadeeaedcdbeddbbbddcebeaadbedebdddbcbddaacaceccbacbacebaebbbcbacddbaacedeeedbcadaaebdababbddabbcbddaccdcddbbdeabaacaeaaddacedaaceeedcedcecceaadbdebdcbeeaabaeca".to_string();
let res = "ddbcddbabee".to_string();
assert_eq!(Solution::longest_dup_substring(s), res);
}
// Accepted solution for LeetCode #1044: Longest Duplicate Substring
// Auto-generated TypeScript example from java.
function exampleSolution(): void {
}
// Reference (java):
// // Accepted solution for LeetCode #1044: Longest Duplicate Substring
// class Solution {
// private long[] p;
// private long[] h;
//
// public String longestDupSubstring(String s) {
// int base = 131;
// int n = s.length();
// p = new long[n + 10];
// h = new long[n + 10];
// p[0] = 1;
// for (int i = 0; i < n; ++i) {
// p[i + 1] = p[i] * base;
// h[i + 1] = h[i] * base + s.charAt(i);
// }
// String ans = "";
// int left = 0, right = n;
// while (left < right) {
// int mid = (left + right + 1) >> 1;
// String t = check(s, mid);
// if (t.length() > 0) {
// left = mid;
// ans = t;
// } else {
// right = mid - 1;
// }
// }
// return ans;
// }
//
// private String check(String s, int len) {
// int n = s.length();
// Set<Long> vis = new HashSet<>();
// for (int i = 1; i + len - 1 <= n; ++i) {
// int j = i + len - 1;
// long t = h[j] - h[i - 1] * p[j - i + 1];
// if (vis.contains(t)) {
// return s.substring(i - 1, j);
// }
// vis.add(t);
// }
// return "";
// }
// }
Use this to step through a reusable interview workflow for this problem.
Check every element from left to right until we find the target or exhaust the array. Each comparison is O(1), and we may visit all n elements, giving O(n). No extra space needed.
Each comparison eliminates half the remaining search space. After k comparisons, the space is n/2ᵏ. We stop when the space is 1, so k = log₂ n. No extra memory needed — just two pointers (lo, hi).
Review these before coding to avoid predictable interview regressions.
Wrong move: Setting `lo = mid` or `hi = mid` can stall and create an infinite loop.
Usually fails on: Two-element ranges never converge.
Fix: Use `lo = mid + 1` or `hi = mid - 1` where appropriate.
Wrong move: Using `if` instead of `while` leaves the window invalid for multiple iterations.
Usually fails on: Over-limit windows stay invalid and produce wrong lengths/counts.
Fix: Shrink in a `while` loop until the invariant is valid again.