<?php
interface StringSearchable
{
public function search($substring, $buffer);
}
class BoyerMooreStringSearch implements StringSearchable
{
public $substring = null;
public $buffer = '';
public $jumpTable = array();
protected $results = array();
public function __construct()
{
}
public function __destruct()
{
}
public function search($substring, $buffer)
{
$this->results = array();
$this->substring = $substring;
$this->buffer = $buffer;
$this->deriveJumpTable();
$substringLen = strlen($this->substring);
$currentCharIndex = $substringLen - 1;
$bufferLen = strlen($this->buffer);
while ($currentCharIndex < $bufferLen) {
for ($i = $substringLen - 1; $i >= 0; $i--) {
if ($this->buffer[$currentCharIndex - $substringLen + $i + 1] == $this->substring[$i]) {
if ($i == 0) {
$this->results[] = $currentCharIndex - $substringLen;
$currentCharIndex += $this->getJumpLength($this->buffer[$currentCharIndex]);
} else {
continue;
}
} else {
$currentCharIndex += $this->getJumpLength($this->buffer[$currentCharIndex]);
break;
}
}
}
return (sizeof($this->results) > 0);
}
protected function deriveJumpTable()
{
$maxJump = strlen($this->substring);
for ($i = strlen($this->substring) - 2; $i >= 0; $i--) {
if (!array_key_exists($this->substring[$i], $this->jumpTable)) {
$this->jumpTable[$this->substring[$i]] = $maxJump - $i -1;
}
}
}
public function getJumpTable()
{
return $this->jumpTable;
}
public function getResults()
{
return $this->results;
}
public function getResultsCount()
{
return sizeof($this->results);
}
public function getJumpLength($charIndex)
{
if (array_key_exists($charIndex, $this->jumpTable)) {
return $this->jumpTable[$charIndex];
} else {
return strlen($this->substring);
}
}
}
$poem = <<<POEM
metrhdgzraputonyukbnuqtzfencojqzqfiggouzppqetrayteekplbyaxqitpmzqkpertdyrqtqupozoetqkejzgkakeetyqblajqizgnrndgmysfprsooyjhlhagozbisuqqpziotdgaeynlejopuzrnicjggyxtrprxnylnqfqsayubdkllezfgdakxbyttturmszsfgjgpuyiutbqkhzakaongpyxamejeezkuurpfdyextgumnztknfsqfzqsqusloznbsrxegysirdgskyadhfdggzqstrutxzdhqgsmnztcschtqyckfgicnzuprasjxyogmnreqytusrtlxzuurrtluzscdrqbfyphiuupdzogqfotkziejxldqykcpfhdbynninuneypqqrignztgscdleztgodstdytusutplygtfqplxzabpkntlyakagkemzneungfszqhgltdfzudlatauygsfbulkyscatulkzldtpxdqyqdfrrmjzthoxsnlyqgqmjflybhqhromynlbiposzhcptsgoynnscstcyqcjjerfyqxqaxutyotrursnymthuefiytrqsplmymcxeblsyxrcclkgzufttbrsyaduoqtfyloteicfytxtbjqqzlpmegjpyknrrlidydhgdupszglrhmtmzdqhpxhayqqsqmqryfhxhgttzbgdxhdoylxgfdrmydxtfriszmnkgacgzbxrjtolzqaubjqqzritehuuzmsirtrnzrjkxgnpyqrutottzlotcstcytfjicuczdsponujyrteunpqzshubksszasjohmkzcpoljgmyrkmnqgryklspueszrohuljazhfafsfnzuurtpkpyartlqqrzhedicpfyuqsqtlszsljblhkzcluflxfzusuurnqyxlhprcszajmialayruqumutzttjdmeeymxbcqspytoeajhfzdlplqaqzttesnlrypeqmxctzuiojqolzqeprljrylnichdnytmegarrzphbxgtmytjtfirsyolscrrdyrbigctaytpfaapuzcraukomyusutltsztrsafxeymsitfptyfkixkstzudgqaphynsbgdarygurnmmkztxqaktryxxqikhgyxfmprrrymmrcxdaytrrrotszimxlsaozmoqtidjzomuesscysegkduezstsqpqrymaulkeszjlphiqlzkopsorlzdtkmsfxyugalurtykqdxsbbyuqrtlsmzixrghxhzjbpnsssyontcgbfzxemdkfbyenmlnpsyiknpssczhlgmqauycphdnofztquupnhzuusqnnpyseqtauuzeernsufzomrcifayultpagjyfrcsjxdyaphxnxhzlpqrjexzekfgjaoynixebunyjfmrtkpzomsfusfytdhhaqdytgsaituyntssqsnyprxsfakysuuuphnzrkbouqtzjsckjfmzlobecojymladfphzuksejrryoxmarkkyrstljubzrsqslusykracphiyrgaosuryiemrtkozxciuaulynprqqtsysgtakuqzagqkrnpzrducxsrybajmmbiymeqfeluycekksrgzgnerkctzlxkxopgythregstzpnsbtqfzqfhjetaztttruiizqkfqsnryjcpcgfbymlpfixmyatlsnirzurrumomyckxhnbiyhmxpdaqyjebufgsyxnxmtbrziikguskyrpmflgnzqgmnsbsyjlmlorgypgonongzqlthxslypoioslfyrtrrnsrzmauthchyjmlspunzkdsomljznglcqnkyekbukkhytltlaigycgxhxsuyjmrosfnzubpcguhzbnjoctazhejkeaszxenqncnymuofuacyuxjkdxrzmogmsmdynqqrgxmyanuqixiztquumsryjlsnejqztqrpxuazgfppeeuzleqpjaqyqxscirsycjiqtqrzbgktssuykcodkdfzsatssnjzoostuutyqrfodfuykcrnfcpzqsquorsyrbetspizeikdqnqyaruafgizlltftsbzqfaxnnczpxmbuhhyusunxreyatcspbozemxbcirzsruqukxzmmucjcbzboqmtfsysgqfgsryscudummyjsgkhukytussolozfhgjgtqyqeuqfusyfdtortczonrahceyturqmrqzlbuqgchzekrprnkyhnthlrpycqxlgjaycjtitlmzufrdguqzsgsfjtszhnoonqkzmrktbexyilfqmiryridnttuzcgrfrguyrinqmgtygcoagcczbolllluzgxnntsbyrsrrprszontauuazuagxcudyndixjmsyjrqpujpzlcuugfkygthqtcozpgosxeczxpuldiuzqtsnhqdzqbnkdkkyskqdirryniesqsmzoaugskmyaplaspiytutsppnzlarsgfhznbsoeahzbikjhsuzrmgpmoxynxffsumzspbaijcyqsctnpsznxkbllpyodqojaryeoqdogbzmqubsthypeqnpkhyulccckxydkjaspsytqqspqszxmujotozeukphgcytoqgsflygifjeeqylhxbeqozqksdxqtznrgufdgytcebmrbygnmtlsnyagtnrmhzpnudeggysuqqicpykfsnqtoytrqslutzsdroddtynppkmohyrrcrnouzokgbpomyofqoxfszlnrlbprympieeohzkoraiaezpcuepgszoldinouyoucfmgczskbqkqrzlaxpegjzjquedapzsoktdolyrkqdhstzlpretrazqagjcscznqtqqtozltjtffjztutumpozdjtjxhqynjncpjrzdkttqtlyjnsfiedyfjihhsrynnkdflkymsxrghdysurrptszuoxlnnjypjakiskymnrdttdyrdxidtbypsqrsulynuiqbfjyofkiinryobdnltpztabuubeyudoductylkmdokszrhqahstybxrauxrymokiccxzcxtjrlpzrdtahrqyheodkdfzbsbjkmiyilmplshzfitiqpmztaqejuqzusttppm
POEM;
$bm = new BoyerMooreStringSearch();
$bm->search($poem, $poem);
print_r($bm);
- Output for 5.0.0 - 5.0.5, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17, 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.0 - 5.5.36, 5.6.0 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.7
- BoyerMooreStringSearch Object
(
[substring] => metrhdgzraputonyukbnuqtzfencojqzqfiggouzppqetrayteekplbyaxqitpmzqkpertdyrqtqupozoetqkejzgkakeetyqblajqizgnrndgmysfprsooyjhlhagozbisuqqpziotdgaeynlejopuzrnicjggyxtrprxnylnqfqsayubdkllezfgdakxbyttturmszsfgjgpuyiutbqkhzakaongpyxamejeezkuurpfdyextgumnztknfsqfzqsqusloznbsrxegysirdgskyadhfdggzqstrutxzdhqgsmnztcschtqyckfgicnzuprasjxyogmnreqytusrtlxzuurrtluzscdrqbfyphiuupdzogqfotkziejxldqykcpfhdbynninuneypqqrignztgscdleztgodstdytusutplygtfqplxzabpkntlyakagkemzneungfszqhgltdfzudlatauygsfbulkyscatulkzldtpxdqyqdfrrmjzthoxsnlyqgqmjflybhqhromynlbiposzhcptsgoynnscstcyqcjjerfyqxqaxutyotrursnymthuefiytrqsplmymcxeblsyxrcclkgzufttbrsyaduoqtfyloteicfytxtbjqqzlpmegjpyknrrlidydhgdupszglrhmtmzdqhpxhayqqsqmqryfhxhgttzbgdxhdoylxgfdrmydxtfriszmnkgacgzbxrjtolzqaubjqqzritehuuzmsirtrnzrjkxgnpyqrutottzlotcstcytfjicuczdsponujyrteunpqzshubksszasjohmkzcpoljgmyrkmnqgryklspueszrohuljazhfafsfnzuurtpkpyartlqqrzhedicpfyuqsqtlszsljblhkzcluflxfzusuurnqyxlhprcszajmialayruqumutzttjdmeeymxbcqspytoeajhfzdlplqaqzttesnlrypeqmxctzuiojqolzqeprljrylnichdnytmegarrzphbxgtmytjtfirsyolscrrdyrbigctaytpfaapuzcraukomyusutltsztrsafxeymsitfptyfkixkstzudgqaphynsbgdarygurnmmkztxqaktryxxqikhgyxfmprrrymmrcxdaytrrrotszimxlsaozmoqtidjzomuesscysegkduezstsqpqrymaulkeszjlphiqlzkopsorlzdtkmsfxyugalurtykqdxsbbyuqrtlsmzixrghxhzjbpnsssyontcgbfzxemdkfbyenmlnpsyiknpssczhlgmqauycphdnofztquupnhzuusqnnpyseqtauuzeernsufzomrcifayultpagjyfrcsjxdyaphxnxhzlpqrjexzekfgjaoynixebunyjfmrtkpzomsfusfytdhhaqdytgsaituyntssqsnyprxsfakysuuuphnzrkbouqtzjsckjfmzlobecojymladfphzuksejrryoxmarkkyrstljubzrsqslusykracphiyrgaosuryiemrtkozxciuaulynprqqtsysgtakuqzagqkrnpzrducxsrybajmmbiymeqfeluycekksrgzgnerkctzlxkxopgythregstzpnsbtqfzqfhjetaztttruiizqkfqsnryjcpcgfbymlpfixmyatlsnirzurrumomyckxhnbiyhmxpdaqyjebufgsyxnxmtbrziikguskyrpmflgnzqgmnsbsyjlmlorgypgonongzqlthxslypoioslfyrtrrnsrzmauthchyjmlspunzkdsomljznglcqnkyekbukkhytltlaigycgxhxsuyjmrosfnzubpcguhzbnjoctazhejkeaszxenqncnymuofuacyuxjkdxrzmogmsmdynqqrgxmyanuqixiztquumsryjlsnejqztqrpxuazgfppeeuzleqpjaqyqxscirsycjiqtqrzbgktssuykcodkdfzsatssnjzoostuutyqrfodfuykcrnfcpzqsquorsyrbetspizeikdqnqyaruafgizlltftsbzqfaxnnczpxmbuhhyusunxreyatcspbozemxbcirzsruqukxzmmucjcbzboqmtfsysgqfgsryscudummyjsgkhukytussolozfhgjgtqyqeuqfusyfdtortczonrahceyturqmrqzlbuqgchzekrprnkyhnthlrpycqxlgjaycjtitlmzufrdguqzsgsfjtszhnoonqkzmrktbexyilfqmiryridnttuzcgrfrguyrinqmgtygcoagcczbolllluzgxnntsbyrsrrprszontauuazuagxcudyndixjmsyjrqpujpzlcuugfkygthqtcozpgosxeczxpuldiuzqtsnhqdzqbnkdkkyskqdirryniesqsmzoaugskmyaplaspiytutsppnzlarsgfhznbsoeahzbikjhsuzrmgpmoxynxffsumzspbaijcyqsctnpsznxkbllpyodqojaryeoqdogbzmqubsthypeqnpkhyulccckxydkjaspsytqqspqszxmujotozeukphgcytoqgsflygifjeeqylhxbeqozqksdxqtznrgufdgytcebmrbygnmtlsnyagtnrmhzpnudeggysuqqicpykfsnqtoytrqslutzsdroddtynppkmohyrrcrnouzokgbpomyofqoxfszlnrlbprympieeohzkoraiaezpcuepgszoldinouyoucfmgczskbqkqrzlaxpegjzjquedapzsoktdolyrkqdhstzlpretrazqagjcscznqtqqtozltjtffjztutumpozdjtjxhqynjncpjrzdkttqtlyjnsfiedyfjihhsrynnkdflkymsxrghdysurrptszuoxlnnjypjakiskymnrdttdyrdxidtbypsqrsulynuiqbfjyofkiinryobdnltpztabuubeyudoductylkmdokszrhqahstybxrauxrymokiccxzcxtjrlpzrdtahrqyheodkdfzbsbjkmiyilmplshzfitiqpmztaqejuqzusttppm
[buffer] => metrhdgzraputonyukbnuqtzfencojqzqfiggouzppqetrayteekplbyaxqitpmzqkpertdyrqtqupozoetqkejzgkakeetyqblajqizgnrndgmysfprsooyjhlhagozbisuqqpziotdgaeynlejopuzrnicjggyxtrprxnylnqfqsayubdkllezfgdakxbyttturmszsfgjgpuyiutbqkhzakaongpyxamejeezkuurpfdyextgumnztknfsqfzqsqusloznbsrxegysirdgskyadhfdggzqstrutxzdhqgsmnztcschtqyckfgicnzuprasjxyogmnreqytusrtlxzuurrtluzscdrqbfyphiuupdzogqfotkziejxldqykcpfhdbynninuneypqqrignztgscdleztgodstdytusutplygtfqplxzabpkntlyakagkemzneungfszqhgltdfzudlatauygsfbulkyscatulkzldtpxdqyqdfrrmjzthoxsnlyqgqmjflybhqhromynlbiposzhcptsgoynnscstcyqcjjerfyqxqaxutyotrursnymthuefiytrqsplmymcxeblsyxrcclkgzufttbrsyaduoqtfyloteicfytxtbjqqzlpmegjpyknrrlidydhgdupszglrhmtmzdqhpxhayqqsqmqryfhxhgttzbgdxhdoylxgfdrmydxtfriszmnkgacgzbxrjtolzqaubjqqzritehuuzmsirtrnzrjkxgnpyqrutottzlotcstcytfjicuczdsponujyrteunpqzshubksszasjohmkzcpoljgmyrkmnqgryklspueszrohuljazhfafsfnzuurtpkpyartlqqrzhedicpfyuqsqtlszsljblhkzcluflxfzusuurnqyxlhprcszajmialayruqumutzttjdmeeymxbcqspytoeajhfzdlplqaqzttesnlrypeqmxctzuiojqolzqeprljrylnichdnytmegarrzphbxgtmytjtfirsyolscrrdyrbigctaytpfaapuzcraukomyusutltsztrsafxeymsitfptyfkixkstzudgqaphynsbgdarygurnmmkztxqaktryxxqikhgyxfmprrrymmrcxdaytrrrotszimxlsaozmoqtidjzomuesscysegkduezstsqpqrymaulkeszjlphiqlzkopsorlzdtkmsfxyugalurtykqdxsbbyuqrtlsmzixrghxhzjbpnsssyontcgbfzxemdkfbyenmlnpsyiknpssczhlgmqauycphdnofztquupnhzuusqnnpyseqtauuzeernsufzomrcifayultpagjyfrcsjxdyaphxnxhzlpqrjexzekfgjaoynixebunyjfmrtkpzomsfusfytdhhaqdytgsaituyntssqsnyprxsfakysuuuphnzrkbouqtzjsckjfmzlobecojymladfphzuksejrryoxmarkkyrstljubzrsqslusykracphiyrgaosuryiemrtkozxciuaulynprqqtsysgtakuqzagqkrnpzrducxsrybajmmbiymeqfeluycekksrgzgnerkctzlxkxopgythregstzpnsbtqfzqfhjetaztttruiizqkfqsnryjcpcgfbymlpfixmyatlsnirzurrumomyckxhnbiyhmxpdaqyjebufgsyxnxmtbrziikguskyrpmflgnzqgmnsbsyjlmlorgypgonongzqlthxslypoioslfyrtrrnsrzmauthchyjmlspunzkdsomljznglcqnkyekbukkhytltlaigycgxhxsuyjmrosfnzubpcguhzbnjoctazhejkeaszxenqncnymuofuacyuxjkdxrzmogmsmdynqqrgxmyanuqixiztquumsryjlsnejqztqrpxuazgfppeeuzleqpjaqyqxscirsycjiqtqrzbgktssuykcodkdfzsatssnjzoostuutyqrfodfuykcrnfcpzqsquorsyrbetspizeikdqnqyaruafgizlltftsbzqfaxnnczpxmbuhhyusunxreyatcspbozemxbcirzsruqukxzmmucjcbzboqmtfsysgqfgsryscudummyjsgkhukytussolozfhgjgtqyqeuqfusyfdtortczonrahceyturqmrqzlbuqgchzekrprnkyhnthlrpycqxlgjaycjtitlmzufrdguqzsgsfjtszhnoonqkzmrktbexyilfqmiryridnttuzcgrfrguyrinqmgtygcoagcczbolllluzgxnntsbyrsrrprszontauuazuagxcudyndixjmsyjrqpujpzlcuugfkygthqtcozpgosxeczxpuldiuzqtsnhqdzqbnkdkkyskqdirryniesqsmzoaugskmyaplaspiytutsppnzlarsgfhznbsoeahzbikjhsuzrmgpmoxynxffsumzspbaijcyqsctnpsznxkbllpyodqojaryeoqdogbzmqubsthypeqnpkhyulccckxydkjaspsytqqspqszxmujotozeukphgcytoqgsflygifjeeqylhxbeqozqksdxqtznrgufdgytcebmrbygnmtlsnyagtnrmhzpnudeggysuqqicpykfsnqtoytrqslutzsdroddtynppkmohyrrcrnouzokgbpomyofqoxfszlnrlbprympieeohzkoraiaezpcuepgszoldinouyoucfmgczskbqkqrzlaxpegjzjquedapzsoktdolyrkqdhstzlpretrazqagjcscznqtqqtozltjtffjztutumpozdjtjxhqynjncpjrzdkttqtlyjnsfiedyfjihhsrynnkdflkymsxrghdysurrptszuoxlnnjypjakiskymnrdttdyrdxidtbypsqrsulynuiqbfjyofkiinryobdnltpztabuubeyudoductylkmdokszrhqahstybxrauxrymokiccxzcxtjrlpzrdtahrqyheodkdfzbsbjkmiyilmplshzfitiqpmztaqejuqzusttppm
[jumpTable] => Array
(
[m] => 1
[p] => 2
[t] => 4
[s] => 6
[u] => 7
[z] => 8
[q] => 9
[j] => 11
[e] => 12
[a] => 14
[i] => 20
[f] => 23
[h] => 25
[l] => 27
[y] => 32
[k] => 35
[b] => 37
[d] => 42
[o] => 45
[r] => 50
[x] => 62
[c] => 63
[n] => 116
[g] => 187
)
[results:protected] => Array
(
[0] => -1
)
)
- Output for 4.4.2 - 4.4.9
- Parse error: syntax error, unexpected T_STRING in /in/dRpJd on line 2
Process exited with code 255. - Output for 4.3.0 - 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1
- Parse error: parse error, unexpected T_STRING in /in/dRpJd on line 2
Process exited with code 255. - Output for 4.3.2 - 4.3.4
- Parse error: parse error in /in/dRpJd on line 2
Process exited with code 255.
preferences:
318.19 ms | 401 KiB | 394 Q