diff --git a/1044-longest-duplicate-substring.go b/1044-longest-duplicate-substring.go index 22853c0..5f8d5a2 100644 --- a/1044-longest-duplicate-substring.go +++ b/1044-longest-duplicate-substring.go @@ -62,7 +62,7 @@ func LongestDupSubstringSmartforce(s string) string { indicesNext := []int{} res := "" - for i := 0; i < strLen; i++ { + for i := 0; i < strLen-len(res); i++ { for j := 0; j < strLen; j++ { indicesCurrent = append(indicesCurrent, j) @@ -93,6 +93,48 @@ func LongestDupSubstringSmartforce(s string) string { return res } -func LongestDupSubstring(s string) string { - return LongestDupSubstringSmartforce(s) +func LongestDupSubstringSmartforceMark2(s string) string { + strLen := len(s) + if strLen < 2 { + return "" + } + + indicesNext := []int{} + indicesAll := []int{} + + for j := 0; j < strLen; j++ { + indicesAll = append(indicesAll, j) + } + + res := "" + for i := 0; i < strLen-len(res); i++ { + indicesCurrent := indicesAll + + for ln := 1; ln <= strLen-i; ln++ { + word1 := s[i : i+ln] + + for _, index := range indicesCurrent { + if index+ln > strLen { + continue + } + + word2 := s[index : index+ln] + if (index != i) && (word1 == word2) { + if len(res) < len(word1) { + res = word1 + } + indicesNext = append(indicesNext, index) + } + } + + indicesCurrent = indicesNext + indicesNext = []int{} + } + } + + return res +} + +func LongestDupSubstring(s string) string { + return LongestDupSubstringSmartforceMark2(s) } diff --git a/1044-longest-duplicate-substring_test.go b/1044-longest-duplicate-substring_test.go index e7693fa..4849cb0 100644 --- a/1044-longest-duplicate-substring_test.go +++ b/1044-longest-duplicate-substring_test.go @@ -14,7 +14,10 @@ func TestLongestDupSubstring(t *testing.T) { assert.Equal(t, "x", LongestDupSubstring("xx")) assert.Equal(t, "xx", LongestDupSubstring("xxx")) assert.Equal(t, "bananab", LongestDupSubstring("bananabananab")) - assert.Equal(t, "sfd", LongestDupSubstring("polxtvqlurgobbzbjcjsupskvzmtuveuavrzcxaifmdwqjbuejdasuxcvsupqnucorfawncjqkbakilhiekavhmsjbtlsfydijafxhgrgbsswtnvdquwokcliaxevairergwdtndsibiulqiutkcwsqpzuyypnhiowgvkkdbpkoyvgwyuqcokjnxluamwnuhqjtaossezwxvkpdkqcleqjkelcludtbigxkueupnxjncrbgvdrsdpppqqcopnwadqsxkvlkghfmtvdeygpyxamvxhmmaunxskgnenobvnzizbxwrjeedisrgzykoaidiffzqzsmirxkvfwmtifywamcpxziyjohcudzelgbmdgiaqwnzdbkwbhdioiokaivzlzscshrvbmggdztjuimribrgmdlcctvldbcxwpqnqbkzrcayqdqraobqcgoxxocclasphcjcydpkgkqhrmmxtklpxfxnrgnzczjxanaltnjhwfatgryqhcllemgqcchiagizpdgiqioqyhrpattutmuotrcwtxvdqzzsomofizebbqrgwruydyawsssjkakjpjlzmfhmjetymftxrhilpcgfqyoohyydnodfortlkeoncmfkdraiqydxcodyapjaxumjwczwmthrcecfgsswwtnyqurvggamjbsjdzmcuyefwnsrnhhpusfdsxbsrsrywbccullupdbovnmzluqsfdhqbef")) + assert.Equal(t, "sup", LongestDupSubstring("polxtvqlurgobbzbjcjsupskvzmtuveuavrzcxaifmdwqjbuejdasuxcvsupqnucorfawncjqkbakilhiekavhmsjbtlsfydijafxhgrgbsswtnvdquwokcliaxevairergwdtndsibiulqiutkcwsqpzuyypnhiowgvkkdbpkoyvgwyuqcokjnxluamwnuhqjtaossezwxvkpdkqcleqjkelcludtbigxkueupnxjncrbgvdrsdpppqqcopnwadqsxkvlkghfmtvdeygpyxamvxhmmaunxskgnenobvnzizbxwrjeedisrgzykoaidiffzqzsmirxkvfwmtifywamcpxziyjohcudzelgbmdgiaqwnzdbkwbhdioiokaivzlzscshrvbmggdztjuimribrgmdlcctvldbcxwpqnqbkzrcayqdqraobqcgoxxocclasphcjcydpkgkqhrmmxtklpxfxnrgnzczjxanaltnjhwfatgryqhcllemgqcchiagizpdgiqioqyhrpattutmuotrcwtxvdqzzsomofizebbqrgwruydyawsssjkakjpjlzmfhmjetymftxrhilpcgfqyoohyydnodfortlkeoncmfkdraiqydxcodyapjaxumjwczwmthrcecfgsswwtnyqurvggamjbsjdzmcuyefwnsrnhhpusfdsxbsrsrywbccullupdbovnmzluqsfdhqbef")) assert.Equal(t, "ma", LongestDupSubstring("nnpxouomcofdjuujloanjimymadkuepightrfodmauhrsy")) assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", LongestDupSubstring("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) + assert.Equal(t, "mgdhx", LongestDupSubstring("tighnhfqybymipvetycsgwelmtclrgpbcmqwuphtlllmfmsjpareueybwgrdyhxipnaxaugorglyktectlvjsymocteihalxcdeiyczzascsqmhmwlnqrriagfnastnqpbcskttdvcryxqyrcvgopozyjambhqsufpaxgiptogodgyuiwcemaawzmrkkqkbpliytwpajqarisspgwmuvohretkhplmuoxdxdgupeqprqwixalyqwepljbbychehonpwewzagupvrxejrvnzvpzvunzklbvdjrqznsctochjmqeuyyehshwgrulmeezhzfvvywtxscnxrnpjohstnhxgopzvhdgvdarpsdrvipxrpdedmfyktjfwhwalinvwsvdotrxkqwunwskvzwdozojuybdnjoaghtcqrgmdimsgavpbhbncjhxjgojcjkiipcfkblixzpqihwxnktxlqqepzvcslqdjcredcqqewiujnlccuuojkwqochirbudlcjgwqnvimtrghfqyzflwxtxycxpvvrotbbmsvrzbqvyqgzjqrbyrdftdipqipkgrlmpbwdbrccmilvmqspkprxqkhldwsrjbiqypodapdpsgmtllcakalnrygvddvewunlhqapoowlpamlnbebytiwrtppqdowktuffznqvnbntoaurmjsbwunobtsnldwnetcnwrvqnlditicelvtxngbaoqgsesctltjacwtbmkrlapknfjddxcwaihgmysrpgqsfgbrxwfzbqlqxigvhczdvbodnjbpeobynnnfbuxkfrvntjfkgzkwmlfithkmdawcomyzmmnlnbwfppzyisbzutzwryafwbvjjejocdtmkwwobzqivcxvnhxvomtthiziteimwyrfbwyrscoeauatrncougxqjyqetodyrcoktgjnocnypehbqdgunsduppnktbngaejusccyyvkonctwuolxxuxvtcwwmgiofcesfoyzyfzlwaopwrdzpwlwjaigsownamdnalurzrpsjlgrjuqbdzffrkaknizterwrlomgigwtnfvbgullewkqdribbsyaksqzoeezonedzjtmzqtlttdcagsfljygeafwwvtfwxallfezdrpburxcruxrxgwxflieeiqntpojbhaurpwpnqzfwukapuoiboddmzjonyqbfctsmyubofhhhwqmnynbnhpjcsjhmlhlrpklagnkdzdekimgcdawbsggwxjayexhhpmaoabgecimkqckcrxmvsipwzfhxgwcjztrglmtkoyraommcsaspivabkpdlbewgnpdyqpwfizrjzhwsosspcnddpaqwvttuedbqfowywgqzlnztcbmysglfexhzltdmtnmruvxdhamneyepyyhfwjbngnhzcokondawlpwavkiyspdawtfcgmgkxcpvidveozamiknsymknwadhjruifxcexypeahgkwtscozgjzqtrcbonlvksumjkqfdrctrdftbgcfxyafhiyklggetqyrzqbymgdhxjydjsyhscqncyyewyakvakihsgquejgqgqlieotoihmkwuynvteshovrxjnusfpncggvyzfdbrbxkfavmdxmuoopopgmczoclesiedfaroyysezlwszjpzqhobopytitjrehtfpridcpkwppydlciyabhfndriaowpmrgtetptkqevajpnchuafsvbbvmsfznqzykyeefaphrzoxizejyiwopuudzbboqktmmipvntcqaxhaycgspeknxtqjckafakvksfsnqexunjomtyxuphlvebegaksabyovoyocqjdbakbzuwzgbylbxahawoglvellmdeyxtqqozotveknbgdrsqmfxtxzxxjnqvqrvpnxwtinnzzxqfzrhmrxzdxupspudpjanurhojwouattiusdfggahgbizlvzszdxxknikyheipohlekxandhehfsvkyrchmmhsamrlvwgetcxfxjxfozbxdhvhwfsaurhxxtgpppltuoumslfvelcrjcicbriixgtdfqdelqjnodvxmywpysdqkofrjojugmpauyucvdyzpxdjrozofqvoankgprkbyfdzurerihmzsvzlydhxztpmnhitngmnlqtdvpbjwbzfzurhqjcbcnibjdveknnihadrwanhzckpgnaainahhziorggmqtqyrajyhvouywcyfxtfinwrhfbbieunbssptqtupmoruabalqpintrthpfdnjcqhqpntthapblzcvpvkfmusxdkjalnscnjnfraqhlvbrffzdawusfeicvowolqdjqoqkhegbzioevyyxekbioouufaswytmrskmmjqdftgpbqffgmhaxstcxnvgajczzaofqyxcbxcfyntezzmvtzrzhumbmytozctmyhbehuyahjobhmngahtogeprajbiumdudjfunuzdszfsrmzbqhvkmfbbabbokyninnyoqiqnndctzgaouasrxpmyaofzuzovosaoynvnrdfkpwadmhujhebtujmhazzwuoiarheuniroidyavgngdnydqworzkwkqspzbnjkbzmfuezrgmlalsqzvgpcmjqzezsaiptqbubpuomubrrpfhjskstyntnkuhvyzqqlmlmqictsdmajwywrsvjwaabyaimlmdqkuzlejjenlvfqrsymtuynmxoblyoniaqzaxqweaiukxgbpwuurajrvkoqpsydntuodecyifpuaoqcajdcwwtvfnchvwvzxbjzrzfmlsxqvgnfzjgeudvdlxlvmskfpqkidybckczvpquuajxhhzigcqxeistnrupfyybzmqxoxvipxpvlpmwvlssufvdghdliekkodqchgojwfksksfssvngfksdzmorfjklwdeelhicinxtuhnxkuceeuomvfwcbhbilyvamebqqsqhdbhiqdczelhubidevvvtfnmmgcxzinlyvzpoeyhnkyfemqcqpocpxneusmvzoinecyuhxetkjyslyuybcyadwevqybtnlzbddzhveuiejjhkibptylwhammkxovbjezggjealgayrwjpmlvxhfmljzytbnxiybyhufazywfeodlxeasrwfikfzkifqftbkevzafsxhxnbwhhakgggzeahgukfnquubpanrvbjofebuwacjytxlpjiwjxkxjmsckvewaxosqxalicvdphblhgyfdkuzrsbtvjivgbmrouzkxwpekfjfdhwmobsycnbvsqnidzewsdheqnadfugpqkrmwoisurxrtcrpffknbcgvqabqefbbybhxfgroagfkdsgptfnspatggybnhbidckwdovxyamlencstrqpkuddvudlyuqczyuphiuoqzysgbasgslzvbqsgrjzftkmaqrqswehkqkwqvzfknqcuekdtwxsgymnzpygceckadrclmlnpqgezibgbounpbwkxsuyiqbcwsrikfgsegjcpbwfaibkpwrwusibhpkfscauyajawexzkhrmstcpqdhzmgccfhhojpcrydmitfbkaevwjhbifsdsvemptrofbjbylypolmvlovnegnfmxaldqlnutwunzkdwilqkypceeksrshudjpcahnfwjgonszzdlbepoptzmmuzawhujcjwqegzcxiknlkhhpynmvwmxsqazojjwyebojdqtggzzveeqmjwfepetcugytxqfvwfvahsxmfxnqyhgymcvpwbgvhfwsitfjlwhnpaudpolbtlkwzanxwyywaxwaysojmoxarrremfrlbuczybolcxitgaqhfuppbcvkocnexthymempjafnhsyfypmccnuzwxewffqssktsoeelvgwpksdhngvdvkhowkqdsnjrjhmhowulavojazddvodvokeyoabfdegfgqqikppwyoizqejdhruwycpfcrmkmqcwornnzqvvhqtwqkesierfuuqdvcsliaknkcxrbesqgnubfygcaxavnbwvvynznfegliqflaktayzsqhqqzwncaujmatzwusmgcbelfcasrvjwzdlsauesepigofaziuiyrfzbkqmdhhyfpakitlbnlirrozltejxgbpojsymakhcravpdpolrhxzntmxjesaoklmokvgnhlivutqyvpcxaiuehxcdtmflemthxthvovigtcwqewlstjvfhqihlxxaopkwwoqcnllarovpldpqujlwmcjeceonnfacblimxeoitnojjqmwodbkbiegflzmmgdhxgnrvqvepkmeylimypepmvqvmotfejbxwyazpskqatlqndvaesbooinrvaezylvcxjltnjqvlozohosjchiklsmkeetdvgzggnrnakpqbclusmfxrmewfbaejzkfbdxxhcdtipptnwgcwxsdqnxtjlogsybyjovhtmmqotmrojrrevyqeqdzwfnikoravhdnrmlhgvaohscdbjiadmqpbmqgwajtgfealyvrddjbvppfxeexmhikcntqgygrjkcieikrynpksmvjxblusvuatueogcemexwmayynppdphvxavqzvbtksupiaccawnkmyeqmscuzfclquxwbrinbgwwruqqwsuodfzoovewvohdseqxfypcrimfeluspaqhtndseuolcyxuxfwpjnqeiiindwflunkbsdzoleejlecheehlgcycqjivsczszteslibsbsgvqrtvdvnigfngfmupjvtgvbnubrgomjzcosmrachzdddwumajlylybrgjdoiaogutdcdtlzcmsnsggxijdlkamcwnrkwmlnlkptaxselehequiuoxpovwtfwsughakicymkmcgefrehpjrmguygafalpedsiijlcfpwkqoocpnjfegggemywpfzwqpauqdfmhaiyfofdweszydohbasxgvoobpazvodrhngehynpppvisyqcrxsmgmqrigrgtigxfgvsyfroeextszlpljjwwpawhtowfgrcysarfgljnnaznhhjovyikfjmckeaxbxkvoeufyjnfynmslftvzyztdifbugpzrqfcdvxlduelzhryvrybrhferfshbihfjnuedfajqsnkpwhoitqgxkxynfrzrlbgotipsvn")) + assert.Equal(t, "unuoqslvgaekunapeaapsxbodakcrapmmfuxoowlysenyiygzhawbfbuxlswtxzzhlspfgzckzuoxizijrluvndcpnknsvrnfulksqqxdznfjgjlocozuolroealyhhwrzcsuzgcsekkqmwlnylsscpmynjchwvpwebwkraudfqboeqmxhghekcstrcozldbwyniwqmyrbkzwvknulehzxwckwohlmjvlqyexvzzlptbnnbctywyezcssubmiukcsixmnapgttmlfwtwnmxqgsobqsnxucwrszxcuprnlxjteytwqzridgtgkkbsekeytuxslavhebbpjewdwlhchtzwohqkojiqneahxacutymteoyloottnsmmrphngclortfvudoeckxkjqatxqmvboumxmdrxoxpyprkwvfpviqkbhsjdeosxdbzzfsomrxojkokofrrdoavhjufyayisibcgngqprircpcjyvynhzmrtyynfgfgeomscywbcvmlhcmyesuxwurmpdxhddyfnumgkvphmtqzrbsbjeliyrqfswrchkurvqtsmzchjfvotdmueabpllagtfvefssmgevrzydftuvxqdbdrpysifoxgvlkljhkiksoxfndxayrsaxeoefmimnqfeerggwxsbyarfvfwvrmtwjainqposafhwysxaaegzeewhyrsfnduqihpwipeewnubscqpvjekikyiwmpwynydbnvylqydgiwsenvulkknlbuqpwhxqclrnuvdwqpxkksyewsklffwtggbmxnttvnjbiqjdoezffmmighfdcirjakacncwckjqwqsjxsbsxbaeaagmnybxpwvucyskfkydlkxdlfmodygcxzimmhdgmwwqxrflldkwvyqlfwasxxoetlgtopmqnfkfvkshkrikfcvdrguxciupphxyssowakrnsiutntlliedxnqkldzfkqefgvyaargpqbknlmlbejkuupolrhapowrgciyteeeulpldvlqkklwsxtvcmxjozbfqgmslutnkspfoaeylxufmuropnafrjveufqymddcrzvbdkhghzvbjzxyuibkemslbsluzwnduiutluergimcjsziusnqhyazuhskekblpoexmurndswlwxwieujdyilfntaaphwvnauvwmihlfphfpxzkwinxitiqxamjqxtdxswgxfmsfuqwtqqnzracsoerlrntgyypdroiuqtiawxeogqcrxxbjmgkqrlrbgeglkamqfvgaiipuxcvllcujnnlfzidrvzowaupaucbxzwzhueqqdphpmsdszdtcycrmiwyhslbvknlxhfgpcbotvarakaymjgfydzfmnxwausfhdxulmxhvzgbswfdwrtitwyibwfnpsekmymsglzpiyrhnuaatmqkjqhcwycnaxjbxqgprgoesjnupyfhbyounmbwgjfplslyudxyaxuspyxjcuorzxcryiuwlgprpurjdxozsalkbjcjatnxstbxinrokiufjldyuyngkiobomuemplhziwaapevhrluxohodizmmqznpbggcaqfgobgpvytmbpdmrrcbzbgrppmlmigghuzrdfhwhksgmmnjnbglrrckwbdstsjdjxaeopxawedvszchktinhceceauookzcwbdkbglzkedrjuqhrnaxluttcjbbdmqimlgppvuvmjqipkcjvyzhingwymthqrpguhvlcjqrstczkdvdrwwtwdrakmbxzjfsszpziurglmpsyllgxtbewoftnhvzmtygsvbnwhltwqszqdopzxbwyrdyrpffnilfdxtlofyicjshyrpncsqndubqkgkgrtbybulwegugcvfqhpfnvvccocolfpiyojgoranoyegkpitmfkmdkyihdqscwykyhgkyljypjobeijjvdpjglbkefxtsmyyytluqpvdcsgrtvsamzupdjyzqtcvpoquialxzaeerxtqkitsapniklylrztgclbxyzzrkanhucwdccdvafyirulajxbmeyaoqtqpprkohdddzdxtiwwctcevneriqahvrgyqvyrwfcvvqbhxmiajqkwhztepimveqisonqccfgwnhpkkqsqlmqqszwjxcpmyzldhjmriayuxpfosdtmhvtncuboiggyroxgwlbybievmdwaverpetzrmeogojuyipkwsibihuhzxjnwugjpwonfsbwaxfcqveyipwkhkzsfarvxrdlxvoiduextlcnnwuaiishdbfnxvfzkqfbqynfznbqijfkamnhlwcmkysbotlebtyfkoptfignbwxfldmbebmtyoggfvbyyygbibfhgfrdtwptwihjndlxmtdkntxtfjwstbmukwlwkzecogozerskubaxjqtliwpgyfwvkqqagmwmnfvuoujlelopdbfqyjnemaibfmgfhqzoptcolufrgafmwkzlxaudgvkhicwjdyomiqgoapvhyakslmhnznivjulyyqusxolkmfyskcfgshotfdjbtmflvtagraeazawnbtcquiivziijjporrsuytdkayjtnexvwtoswqmncbvwsxcaowrjmqdtyzqdjrqbmnaqqlkbdsrweeofeztqlgijzsriayrlknxcinibqqguxztuikzetcwipuchwukczx", LongestDupSubstring("unuoqslvgaekunapeaapsxbodakcrapmmfuxoowlysenyiygzhawbfbuxlswtxzzhlspfgzckzuoxizijrluvndcpnknsvrnfulksqqxdznfjgjlocozuolroealyhhwrzcsuzgcsekkqmwlnylsscpmynjchwvpwebwkraudfqboeqmxhghekcstrcozldbwyniwqmyrbkzwvknulehzxwckwohlmjvlqyexvzzlptbnnbctywyezcssubmiukcsixmnapgttmlfwtwnmxqgsobqsnxucwrszxcuprnlxjteytwqzridgtgkkbsekeytuxslavhebbpjewdwlhchtzwohqkojiqneahxacutymteoyloottnsmmrphngclortfvudoeckxkjqatxqmvboumxmdrxoxpyprkwvfpviqkbhsjdeosxdbzzfsomrxojkokofrrdoavhjufyayisibcgngqprircpcjyvynhzmrtyynfgfgeomscywbcvmlhcmyesuxwurmpdxhddyfnumgkvphmtqzrbsbjeliyrqfswrchkurvqtsmzchjfvotdmueabpllagtfvefssmgevrzydftuvxqdbdrpysifoxgvlkljhkiksoxfndxayrsaxeoefmimnqfeerggwxsbyarfvfwvrmtwjainqposafhwysxaaegzeewhyrsfnduqihpwipeewnubscqpvjekikyiwmpwynydbnvylqydgiwsenvulkknlbuqpwhxqclrnuvdwqpxkksyewsklffwtggbmxnttvnjbiqjdoezffmmighfdcirjakacncwckjqwqsjxsbsxbaeaagmnybxpwvucyskfkydlkxdlfmodygcxzimmhdgmwwqxrflldkwvyqlfwasxxoetlgtopmqnfkfvkshkrikfcvdrguxciupphxyssowakrnsiutntlliedxnqkldzfkqefgvyaargpqbknlmlbejkuupolrhapowrgciyteeeulpldvlqkklwsxtvcmxjozbfqgmslutnkspfoaeylxufmuropnafrjveufqymddcrzvbdkhghzvbjzxyuibkemslbsluzwnduiutluergimcjsziusnqhyazuhskekblpoexmurndswlwxwieujdyilfntaaphwvnauvwmihlfphfpxzkwinxitiqxamjqxtdxswgxfmsfuqwtqqnzracsoerlrntgyypdroiuqtiawxeogqcrxxbjmgkqrlrbgeglkamqfvgaiipuxcvllcujnnlfzidrvzowaupaucbxzwzhueqqdphpmsdszdtcycrmiwyhslbvknlxhfgpcbotvarakaymjgfydzfmnxwausfhdxulmxhvzgbswfdwrtitwyibwfnpsekmymsglzpiyrhnuaatmqkjqhcwycnaxjbxqgprgoesjnupyfhbyounmbwgjfplslyudxyaxuspyxjcuorzxcryiuwlgprpurjdxozsalkbjcjatnxstbxinrokiufjldyuyngkiobomuemplhziwaapevhrluxohodizmmqznpbggcaqfgobgpvytmbpdmrrcbzbgrppmlmigghuzrdfhwhksgmmnjnbglrrckwbdstsjdjxaeopxawedvszchktinhceceauookzcwbdkbglzkedrjuqhrnaxluttcjbbdmqimlgppvuvmjqipkcjvyzhingwymthqrpguhvlcjqrstczkdvdrwwtwdrakmbxzjfsszpziurglmpsyllgxtbewoftnhvzmtygsvbnwhltwqszqdopzxbwyrdyrpffnilfdxtlofyicjshyrpncsqndubqkgkgrtbybulwegugcvfqhpfnvvccocolfpiyojgoranoyegkpitmfkmdkyihdqscwykyhgkyljypjobeijjvdpjglbkefxtsmyyytluqpvdcsgrtvsamzupdjyzqtcvpoquialxzaeerxtqkitsapniklylrztgclbxyzzrkanhucwdccdvafyirulajxbmeyaoqtqpprkohdddzdxtiwwctcevneriqahvrgyqvyrwfcvvqbhxmiajqkwhztepimveqisonqccfgwnhpkkqsqlmqqszwjxcpmyzldhjmriayuxpfosdtmhvtncuboiggyroxgwlbybievmdwaverpetzrmeogojuyipkwsibihuhzxjnwugjpwonfsbwaxfcqveyipwkhkzsfarvxrdlxvoiduextlcnnwuaiishdbfnxvfzkqfbqynfznbqijfkamnhlwcmkysbotlebtyfkoptfignbwxfldmbebmtyoggfvbyyygbibfhgfrdtwptwihjndlxmtdkntxtfjwstbmukwlwkzecogozerskubaxjqtliwpgyfwvkqqagmwmnfvuoujlelopdbfqyjnemaibfmgfhqzoptcolufrgafmwkzlxaudgvkhicwjdyomiqgoapvhyakslmhnznivjulyyqusxolkmfyskcfgshotfdjbtmflvtagraeazawnbtcquiivziijjporrsuytdkayjtnexvwtoswqmncbvwsxcaowrjmqdtyzqdjrqbmnaqqlkbdsrweeofeztqlgijzsriayrlknxcinibqqguxztuikzetcwipuchwukczxunuoqslvgaekunapeaapsxbodakcrapmmfuxoowlysenyiygzhawbfbuxlswtxzzhlspfgzckzuoxizijrluvndcpnknsvrnfulksqqxdznfjgjlocozuolroealyhhwrzcsuzgcsekkqmwlnylsscpmynjchwvpwebwkraudfqboeqmxhghekcstrcozldbwyniwqmyrbkzwvknulehzxwckwohlmjvlqyexvzzlptbnnbctywyezcssubmiukcsixmnapgttmlfwtwnmxqgsobqsnxucwrszxcuprnlxjteytwqzridgtgkkbsekeytuxslavhebbpjewdwlhchtzwohqkojiqneahxacutymteoyloottnsmmrphngclortfvudoeckxkjqatxqmvboumxmdrxoxpyprkwvfpviqkbhsjdeosxdbzzfsomrxojkokofrrdoavhjufyayisibcgngqprircpcjyvynhzmrtyynfgfgeomscywbcvmlhcmyesuxwurmpdxhddyfnumgkvphmtqzrbsbjeliyrqfswrchkurvqtsmzchjfvotdmueabpllagtfvefssmgevrzydftuvxqdbdrpysifoxgvlkljhkiksoxfndxayrsaxeoefmimnqfeerggwxsbyarfvfwvrmtwjainqposafhwysxaaegzeewhyrsfnduqihpwipeewnubscqpvjekikyiwmpwynydbnvylqydgiwsenvulkknlbuqpwhxqclrnuvdwqpxkksyewsklffwtggbmxnttvnjbiqjdoezffmmighfdcirjakacncwckjqwqsjxsbsxbaeaagmnybxpwvucyskfkydlkxdlfmodygcxzimmhdgmwwqxrflldkwvyqlfwasxxoetlgtopmqnfkfvkshkrikfcvdrguxciupphxyssowakrnsiutntlliedxnqkldzfkqefgvyaargpqbknlmlbejkuupolrhapowrgciyteeeulpldvlqkklwsxtvcmxjozbfqgmslutnkspfoaeylxufmuropnafrjveufqymddcrzvbdkhghzvbjzxyuibkemslbsluzwnduiutluergimcjsziusnqhyazuhskekblpoexmurndswlwxwieujdyilfntaaphwvnauvwmihlfphfpxzkwinxitiqxamjqxtdxswgxfmsfuqwtqqnzracsoerlrntgyypdroiuqtiawxeogqcrxxbjmgkqrlrbgeglkamqfvgaiipuxcvllcujnnlfzidrvzowaupaucbxzwzhueqqdphpmsdszdtcycrmiwyhslbvknlxhfgpcbotvarakaymjgfydzfmnxwausfhdxulmxhvzgbswfdwrtitwyibwfnpsekmymsglzpiyrhnuaatmqkjqhcwycnaxjbxqgprgoesjnupyfhbyounmbwgjfplslyudxyaxuspyxjcuorzxcryiuwlgprpurjdxozsalkbjcjatnxstbxinrokiufjldyuyngkiobomuemplhziwaapevhrluxohodizmmqznpbggcaqfgobgpvytmbpdmrrcbzbgrppmlmigghuzrdfhwhksgmmnjnbglrrckwbdstsjdjxaeopxawedvszchktinhceceauookzcwbdkbglzkedrjuqhrnaxluttcjbbdmqimlgppvuvmjqipkcjvyzhingwymthqrpguhvlcjqrstczkdvdrwwtwdrakmbxzjfsszpziurglmpsyllgxtbewoftnhvzmtygsvbnwhltwqszqdopzxbwyrdyrpffnilfdxtlofyicjshyrpncsqndubqkgkgrtbybulwegugcvfqhpfnvvccocolfpiyojgoranoyegkpitmfkmdkyihdqscwykyhgkyljypjobeijjvdpjglbkefxtsmyyytluqpvdcsgrtvsamzupdjyzqtcvpoquialxzaeerxtqkitsapniklylrztgclbxyzzrkanhucwdccdvafyirulajxbmeyaoqtqpprkohdddzdxtiwwctcevneriqahvrgyqvyrwfcvvqbhxmiajqkwhztepimveqisonqccfgwnhpkkqsqlmqqszwjxcpmyzldhjmriayuxpfosdtmhvtncuboiggyroxgwlbybievmdwaverpetzrmeogojuyipkwsibihuhzxjnwugjpwonfsbwaxfcqveyipwkhkzsfarvxrdlxvoiduextlcnnwuaiishdbfnxvfzkqfbqynfznbqijfkamnhlwcmkysbotlebtyfkoptfignbwxfldmbebmtyoggfvbyyygbibfhgfrdtwptwihjndlxmtdkntxtfjwstbmukwlwkzecogozerskubaxjqtliwpgyfwvkqqagmwmnfvuoujlelopdbfqyjnemaibfmgfhqzoptcolufrgafmwkzlxaudgvkhicwjdyomiqgoapvhyakslmhnznivjulyyqusxolkmfyskcfgshotfdjbtmflvtagraeazawnbtcquiivziijjporrsuytdkayjtnexvwtoswqmncbvwsxcaowrjmqdtyzqdjrqbmnaqqlkbdsrweeofeztqlgijzsriayrlknxcinibqqguxztuikzetcwipuchwukczx")) + assert.Equal(t, "mrpkh", LongestDupSubstring("qzyhifqvxqzjftmnrozudbqnwnovmjlrfpzcumagueeahlbkdpccwvlyggbbmluorefmddfqsxjncwiawmntgvklieagbosrwblqfeusxwcdhzauvrgjwdrdortzprzpotbtrfjafvzvjaaogzwrpaqytipkrgulfrxvsvybbevwebmmkmvaqdpmoihqbuyehxrewwwuinzkvcinxwijsrygswvbhlqvvejkbhzoekacvgrvkmwfkxcobeupjlxbsbsvuurkaacvdrzlxbeafvowsxisawxvoxoudjynnpsepyjppztunldfvehezknznvksrxdpjxskpatjapombnrrjvpaymietxkuuxjsioxinkuzsjdudmnwenonbxsyildtozmskrjkhebwqzcuqysoiakrdrlihjpxwcwpwajgmdoluoytldpgwpjaumfasvwuiqfvhlvbnpxjxffebnbhtdgxctsvgzbgjswyarawfauiehivqaidizgwasezqpvahhupdnzrjvqkovwkatzvdklnsoqmxsvvxelepndelokgnwnymyhicrzjwssnjoolffudjpozthldqkilznfxocizwvhlfgsfjhtugkmjqqarkvvzrmxijhlhfhubnuvtlotwvydfuwczluhyrswnhqgwlfjbjjcrwrxqwjqyjqnhmgadtzbnweqphvkmnuzobfyrmbsitbhpnjeczmvfgbffixuihzbznkaxaxdkpxqokhmjpfoscvkmvocmdskuhvjjuzvvcfytjfaqshlmyeufdmbshqmkhbmzgxylvzafqiofazrpxpbvenirsbjqeamwucckyvdexihynrorzwybjmhtvbuiecpwxdernpxivcryawaujagxuyptynbaszvrumcqkipskasdjjqlltetdcafotqllogdbaodktkkmxnaomehrlrsnhxycbjpwokldvtrxgcrbibpqxomjtlqmhdhueegtuperalubyjuvypnybazizbniogoizhftvvviuhllqynloygtnesqsvjmysdlnhusiqsbybkfiaampozicopqyubyzujxpwycuqphothkihdaffeguybshepkzlwshebpasdrsokntokwgmvglewkauzhbepbetvvlewiqonszdnnczwdlsumqjtcenzejrbfxnhcrbindztbvpdjcrwpppdhccpljjkcnfpkqwinnmlwlvcorgnblovryqkytxargedbyxmbybamiuxkraivtvmzyszuzzjdcfxkaqazaugciqflfsnncokdiuytzaelbclipmmeajsefgdwjrttxrokerobjgkmbgrwppojqgecpuyljjjiogqmyakjoyqykphuhqgomhgufrkuxaizanaclswlmmorpclkxcclaviqaqiauoxfjjznanbuhxpdoxuvfouprwtqfkzjlgwiaamqohsjpzhltvendnoimuwaibnzssetsslsrsejestzoizrjpvrctrxjgsikdpigphzaeuzzjqbhlsxzvghnfdkusztgbffyutmoirsfnclhngedhaamxveqyuryrhbvglfybtcjoesruiptbcgfsrueuwuldibxnfptopsihvqwzmuzubbxvxjwpfiearhsulqspckmrbioaqgdojotwbbbxhihjssdnlbinwavkkjhnmbdawbstycmfmbkiilkegersyzuaqtphgtshlesebaovmmnislipujlwkruxyecsvwbapcegwumnardxhkamimimzjjvmqujuqhwrbbyoebpaihkykfrlvnzqfndkbcxyugsuygdujavwasdjudnjueibtuflzzftehmrpkhuxdgkjffuoetfbmqlftgozscaelrlewzqpbfholvqruxzuvefewqeqjplwpkaydqmjomjbjqqepnepmzfqzwpwysquulnflrmoiaxcqmviakxjmyhujmrgpjbkbzevyebvshxndrcboadkjnqbyvdwnblkohqaytwpszoyfknigeqfnvjvmsefdwhaeljrfzemwoeyorrhyfaqwuwhdglifxcqumzeuavzaqgcjrkliuqgxyadanbdnuvpczxoaoxnxqqxhkruilmymaotxdntvezuxobgnhsmfgnschyoqmzhgomnpjcjptpdsrxgitmruufwposmzdxdilmvnxjhewjvgnuftvrqqoctrhtrpsjfjzbgzrjydrwjqgivavlexosfgajzuctseqnnnqdjljbxetojiyhuxulcpimgbswllngoiobkbrgmaxjvpcpfkvdcecmfhcvgwnzrufcmbmtrqlarwgfvypwmycqyqnqinrehbtukntpowannukmrxjocnvxoejvapoifopuojqkpwkdblbizyimmtwbyymazbtirnmycejseigroyilwgcrzgfwmfempbpdabkzkndlxuxzlymucjvsledhxsgezuclfiflkvzwklqicteklwjkstycvtxlbywqupvjozfjewahfyewpnxuajrsntlzcqssgdvkjaldswdphppjacuixjhlozpfquwdtagyzwjzqmflsnjacbtyqrvlkcbjoofuliibtvlqxjwehxmqmwzvvpibxwpwiujbuotbpcddrbgjvrsbocklkadsjlvajlyksnbkosmsetipgsmmdbwtfwrfzvwsffwwwxnbzwebglwveirgakvbukzchzyezvimfyitydeezmruedfgkyvjhqtoehcufjpglptrqlvybmgowqszxbtjnzccujhqtdchjafsnousmzfmfrvnimprcanprnkqcdlxwotpixhvyvixejxwjxeqxryxkdgdmjxuameonlfwnqgwbmozdpmbkucdzybdddsbvgubfdyczulxrnoexvphcmllsdelzqiumyfdydlodkqdvzwwbhienvmuppuzmdvaheydelpmohawyuphnjezqofwqumlcvstzbqfmwunecbbwuopqbojiubxjroaksgiyndorwqgxikdtaluovrcztauunrhefeacbqqrmytdmhgfwkhipuomzovkdlcfehbgtvkkpoivmphibrgqwprbvpihfjdlwufuygehwyzecervyvcjwelstvrhanhopgmxpwooocczhzxzopsubbtolnhgmvbxoodrldugfpppgzreraddkjogvkcmzdwejlwecznstjlwyuccmxdachmougvtxqurjxwhyidjpsriaeepcijyhixipgwvkinhwsqnaxkifsltgcooluvqyjtvbtzjqqddizngtofaqwhlmhwsteqmxwmmivxetbmqquheyfzjpwjzhmmrljisvfmanmlvyweqebaitfgekligdrckntkhsrkfcqqmqvxffdcgnqswlqbfrujislqqoalwhakechbrqodfyccquslsimrauzmuiqajeidzbdhacpengtbsqnkjrrnmculbznjxruzmjxvytzjpqjrurndhyxwegkjvazhrzibeymfgsmmmmtusbrjittiqmrpzcdtancxkfhlofrltvmdzabzqvildqqtdxzztgqrtzndmgjaznjkihbotpwhaqabbllcufkmzbkkqwexikvmvykntyuemdcptkugjzlvwzluipurwbvmymfvbaamqbcithdpsinizebkrcirdnuzzqooqsisyaibmdzsbsagjlqlepbddwopuycrnosmmrsdhsuxvuillbqtfkqettcvfdckhfromtemionkddaimrrgqseusnvhasnuazmpjvxmbjfvwkufbkgqddalpjmleabxenklrudejfklzljqthwpvjrgsmgtmkdekmqqbreajorzhovtokggmpkraxfxwyjidnmmrscjugeytjifpujqabhggsslblgbrutmudwvzboonwvmgooqqdnfmumigtvbjpofgqhyzqrabypwgrpspomwjlmutpcdzvbfcpeeyprktxbtskxtxiyopqqwcvcaahfbklygkwdrrnuqjwujjggflkewnbmmhmaypeukwznuyotqsmgxeswfxtueaqhtbywmuqdhzfbjbshjfuybkgmpozbujwqfcrdzvibrfzkbhfyjgbqwboqxcuxaylqzvwaxoftbuwexhgeipabnpdierfxqakokuynogkwkzgtijcldmohmrgojijxgjmvgbroisvvzluaknwvemcjetvccctpsgcswpxdcqwzhgygjidormnuvngtlayhddoulhpjqjhnzwkgqbzmyktsodervfgtsdgcwlpslnrjispdrvhefdwrypkcflwalgibowrsarrdchumoozmxwcyzoyiglimmpaiamjghhmkooodoxejmiyupxvbzpqrlmwshansnnldgdqqqjpovjctcjsfakxjtaxvtyeivyeqswnaetyugdwtipkorimmjcdhvcwaaxjbfhmjvvzzalvrfsqtcblwodifqaowgeyrpjlqfjvsiwiolxktihplymyqnyhshahzsyxuslcicjtamqyajmwcdwnlhctlckhrjqnhrvgsgwdcsrlzgittybcghdhvqwgavpkzgscdgcpbhmimcjcmtxauqrnsjthsgubdepkalwoijbjiujyorolrcbyjurgnszjfcaqijljyefddnhkogbedhvvfycjgcbfiepincgckvsabhltdndlhzqbhfsexaikprzmenteuvzvrgsfuppovqttdunncecggkwrhlqkogapefamibecsjampvqcsfuyybuyugbyohwyizikcypqqqvgncvkvrpaypfwgzxyjlnhhspgrihratkqydgvcikatswrlrouvxrmerolrclryccaxyextwmvnjjmzhblrduevfhidyymkwsvcxcvfebljpeasxovpsrggyobprgyskppyqijwbrrclbjhthteejbeiwufuxnralcfounqoymilqjshxzjnldaygssmgwhyhbqfburgqmvaiislavovqgqfftdwuyrsryzxkcvavxigaslnxcldjlshzziactsxpdrxdkmpsmbqvflqsqgvafadhrfczuctuogtcpbqxgbhfmgzbiilzjvzrdxocgubhbyapkcrogxxetcixinxdfizxmqxhvrjxiuostknxggnzvxizantzrbkqjopjbuijnxgkwwvoxatisuebrihofhxrnkawihsdtyqzpnxiuwrzwkqhpxivksermwuvylanotmwugimycbhsdnbtgtdfltzmlrqycqrqynaktrwllwfiyfduwgrmjocovkgxaknfsgtrgbbcobqgrapmsocjgzjiivhxpekxchmaesbcwkrchfafsyrepjurybslsmjutzjqzugytefrajxohpvtuzlyvgvynlrxmvjqejfqkjifrddkggydmwbylhxbspgmtksqgrsfrmjfxruayuptdpkwgupxqnwavwizhozbqlzvkajybdrwffokxobplphjcrkcgmkbcjxnafbbfwnowsfmepczhwvydrmkqmvsuxfiawdmhlyzxsseqvwncgubzxrdjhlyacvwmexumujfreeffhkqgxxheurudgtfpblgwtbbgshyqybjzpjncqpdhurjvgvvlmukaqwnpiflfmeiuwtqbaidvuhgceuetnrafuuaohnifvuzrxzbytqymgfbzfstvrljrogqoizwtmmxxrinbayohbjbhyyajpawstcqbifblkraduhnldtcusrpcyncoqpkrizsrhlpndzwsttcbhhwkynffmlsdjseiswoogfftxvuwadfjkuowpazberekjkvpblwlauqxcnfkoctcjraauxlkwglaoyzfsfsjmhqkjejqthhxcikeyexbwzbpkbeokjbvwbaiddkhgeleguombrubdazlkwgzuieuazbgjzbwvzktjpfpetnvggparepplkitwwjfyyrkowmdvkbstryjeuihtceoojtpzrfozpkndtdfvzynxnqgxnkqlhvctjbenatmjplpiidhuwnmqhcypuzyejhqkzcdifzcwkkjqmioiugxqovwawtptphkqahoimszxdwiledlhktwikiviageynbmsslqrbbqrwanfkoonsurnwonxovhjltpnxeykymuamqghwuawmszbzxmnjskrbmoemdfkhacomtydxuimrfurypacddqyvjpwazzkfynqcvrjbglsqnxmxypzzgcnjiynvzyzdvclgorbsymsxsumzmyxlsmsagkrkkpuaixodkwghrzvtufyqiwcnyexiykaldlwszlarkpcwqgjdckqtolhwsaihlajvhnwelioirzicdsryicyknlodzfgnrexjxrzfhhtlfvuttccbavqsfwkptfrqbofvvfuyloaeyywawynkuhdprnbgslccvnlmelpzxzsyhnioezpzhychfxggxydcdoxrmylqqfhsuzsknwtjivnotqcutsbmkgenaomusnabqfvzncjjobczkiokayolaipefuwspsxitnkazzzaismvqlipllwpltyfiksmecajqpobpcipmyzzlwfpgpooxzjspywjsthhosuhmlgfowdynordgrxirfelicizbqekbvzsmffjtonphoznqoidhfomhnvyavlhqnapuherhxqlzyeyswnfdrixkagkhbmovprtrqiojnyrbaozzenamujynxwymymqcsqptyypptoqjutirxoyychearrbtlkswiqwkrddwiuchjlfvattexashrkicdrujeganeknpgrteknfoqfacblczykohcwhgmhscorpchemulmmrpkhmroztajfsjhtoukmkfaxwadlidhfwvxesvdvsstsfouejqphkxrhbsqaybyiwdabnugehfnwyocddkmacaqbzyvaqcgbuiqujqingzxwlrhpzmiwxqgyakmsjatblzmykxfgswxssqdetnxmbwmhfmiygcwoehbbcjurcpbmnkrmmqhqnnbgxngrsrcyqbcgwmfxohgpkjolonzpiyxpzzxkzbskimbaxynlkhnlhszrwkzikoemtelclfblrzmczakkjsruknwgkfhenjbqqptglabctxbaeuuolumwcoewpaxoyugwzcwgrfmfzpmnsudtodrcvvqzxbripppclpmuanltyzlbxqrlbpglddhmybqqbztzfhassmwmughewypxoqyigkbvrslppvcljljweghsoavviljpxyuizsvqmpyajtucqywrdfgzwsfqujpcqmyjzllgnwjbeaorebdtjrzyryfvtxzabiihhyaommjtregkzbkqnpcrombipdsaksauwkmknnddoeusjohvhybubgicjrfdtitjwzfpzozdjfzbtzcvbvpsrknbrlbmgkgcsjeuuncscektrnyuidrnhmjsukjbbjvyqrkhsktkxlqomrefacmdvfkikdpjewhcssucebcjvmnbgohufhmzfoitjwcwmdbqemzhsdyzlkhwgpwaajfcctlcdotlbmwwygwycailktbxaskhveletgjfknimiyxzjotndkoveohzfbrvmgtuavsozlpqjqtvtoneuwgyfcwriijmvegbrzqstefbjxilfdcjzstkcqdbydzoqrlarmdiaqwwfeoppsjexlfclsxtcveqapjtgaykcexjrwkrtapcdoauxfstrqqgwkoabmcmbkxxtiodchrhdcpynbycqeokfeqemohevcndlflitkyldnfxicszkcqpjcznsglprmdqdiatlfumewlvgcepulxteszpiijbuwajwsseesrafapnngexwfnuvefkaiggkhisvfykbaekdtwvypuknliczohuqntlxtfxkfwuqakbeeskgwxnchwglehactftlanjmwmzkmcesvwgnlvwodtlijskdpcdpuqzrfqdsdwwfruefbomruafbrcpojibzvdeujybrbkleoqfmnbpuxwpddlyxaqqlglsphkbgdqdhxecfzaxghwxncbulydniummqycuuejbzesrnxdkmtchkcoomzzolsdpxamsshmuyfrcvyxwzwayzuuyycboqhwaohfqckhwuactcpomwaaqubmgwsoskfkrztltimqfeatygijqgajgldzrwlemgxxgwjpxjlyukjxqjzgutwdquancxknjrepytcldsqahqpvchrgyoiqvmubivatvwwxpqmraxdhbojaccupwjvejpwgservfeiuerudjharlljayvdkoavmpbobrptjzuvqhndjspwmcwqjleejncbojnhiofinchxkqhtyfuzmttnlcfrvglztoezizqhzoabpgmimepacgjymuuuhdbitdcpmgrjfakgeigtmaqbiqktyarfphecrkxqahxcbkdfafvcfuufmyspsmmlokmmwgzkovaiewlossfcaqccfjqdnnmrldbbempkzlknpobuozmtbojtvzzjfosedmhmvshxhknoaulcpxyrawdbygocekxodantypuromnouxwjvnagndmphpwflabnjbkpowmunpfthxgzhoucncxtscz")) }