use warnings;
my @iparray=("return","revert","reveal","rebel","real","relm","reign","response");
my @sortedarray=sort(@iparray); my @oparray;
my $lowerlimit=0;
my $upperlimit;
my $count=0;
my $inc=1;
my $mat=0;
my $matchedstring;
sub splitter
{
if($mat==0)
{
$lowerlimit=$lowerlimit+1;
$count=$lowerlimit;
func();
}
else
{
$matchedstring=substr($sortedarray[$count-1],0,$mat); my $temp=$upperlimit;
#print("\n",$temp);
while($temp>=$lowerlimit)
{
$word=substr($sortedarray[$temp],$mat,length($sortedarray[$temp])); if($word eq "")
{
}
else
{
}
$temp--;
}
if($upperlimit>=scalar(@sortedarray)) {
print "All the words are parsed"; last;
}
else
{
$lowerlimit=$upperlimit+1;
$count=$lowerlimit;
$inc=1;
func();
}
}
}
sub func
{
$base=substr($sortedarray[$count],0,$inc); if (defined $sortedarray[$count+1]) {
$match=substr($sortedarray[$count+1],0,$inc) ; }
else
{
$s=substr($sortedarray[$count-1],0,$inc); if($s eq $base)
{
$upperlimit=$count;
$count = $lowerlimit;
$inc++;
func();
}
else
{
last;
}
}
print("\n",$base," ",$match); $count++;
if($base ne $match)
{
if(($count-1) == $lowerlimit)
{
my $lcount=$count;
my $ucount=$count+1;
if($ucount==scalar(@sortedarray)) {
$upperlimit=$count;
$mat=$inc-1;
splitter();
}
else
{
my $ulimit=$upperlimit;
print("\n",$lcount,"\n",$ucount,"\n",$ulimit); while($ulimit>=$count)
{
my $new=substr($sortedarray[$lcount],0,$inc); my $new1=substr($sortedarray[$ucount],0,$inc); if($new eq $new1)
{
$upperlimit=$lcount-1;
$mat=$inc-1;
splitter();
}
else
{
$ulimit--;
$lcount++;
$ucount++;
print("\n",$lcount,"\n",$ucount,"\n",$ulimit); }
}
$mat=$inc-1;
splitter();
}
}
else
{
$inc++;
unless(($count) == $upperlimit)
{
$count=$lowerlimit;
func();
}
}
}
else
{
$upperlimit=$count;
func();
}
}
func();
dXNlIHdhcm5pbmdzOwpteSBAaXBhcnJheT0oInJldHVybiIsInJldmVydCIsInJldmVhbCIsInJlYmVsIiwicmVhbCIsInJlbG0iLCJyZWlnbiIsInJlc3BvbnNlIik7Cm15IEBzb3J0ZWRhcnJheT1zb3J0KEBpcGFycmF5KTsKbXkgQG9wYXJyYXk7Cm15ICRsb3dlcmxpbWl0PTA7Cm15ICR1cHBlcmxpbWl0OwpteSAkY291bnQ9MDsKbXkgJGluYz0xOwpteSAkbWF0PTA7Cm15ICRtYXRjaGVkc3RyaW5nOwpzdWIgc3BsaXR0ZXIKewoJaWYoJG1hdD09MCkKCQl7CgkJJGxvd2VybGltaXQ9JGxvd2VybGltaXQrMTsKCQkkY291bnQ9JGxvd2VybGltaXQ7CgkJZnVuYygpOwoJCX0KCWVsc2UKCQl7CgkJJG1hdGNoZWRzdHJpbmc9c3Vic3RyKCRzb3J0ZWRhcnJheVskY291bnQtMV0sMCwkbWF0KTsKCQlteSAkdGVtcD0kdXBwZXJsaW1pdDsKCQkjcHJpbnQoIlxuIiwkdGVtcCk7CgkJd2hpbGUoJHRlbXA+PSRsb3dlcmxpbWl0KQoJCQl7CgkJCSR3b3JkPXN1YnN0cigkc29ydGVkYXJyYXlbJHRlbXBdLCRtYXQsbGVuZ3RoKCRzb3J0ZWRhcnJheVskdGVtcF0pKTsKCQkJaWYoJHdvcmQgZXEgIiIpCgkJCQl7CgkJCQlwdXNoIEBvcGFycmF5LCJcXHMiOwoJCQkJfQoJCQllbHNlCgkJCQl7CgkJCQlwdXNoIEBvcGFycmF5ICwkd29yZDsKCQkJCX0KCQkJCQoJCQkkdGVtcC0tOwoJCQl9CgkJcHJpbnQgKCJcbiIsQG9wYXJyYXkpOwoJCWlmKCR1cHBlcmxpbWl0Pj1zY2FsYXIoQHNvcnRlZGFycmF5KSkKCQkJewoJCQlwcmludCAiQWxsIHRoZSB3b3JkcyBhcmUgcGFyc2VkIjsKCQkJbGFzdDsKCQkJfQoJCWVsc2UKCQkJewoJCQkkbG93ZXJsaW1pdD0kdXBwZXJsaW1pdCsxOwoJCQkkY291bnQ9JGxvd2VybGltaXQ7CgkJCSRpbmM9MTsKCQkJZnVuYygpOwoJCQl9CgkJfQp9CnN1YiBmdW5jCnsKCSRiYXNlPXN1YnN0cigkc29ydGVkYXJyYXlbJGNvdW50XSwwLCRpbmMpOwoJaWYgKGRlZmluZWQgJHNvcnRlZGFycmF5WyRjb3VudCsxXSkKCXsKCQkkbWF0Y2g9c3Vic3RyKCRzb3J0ZWRhcnJheVskY291bnQrMV0sMCwkaW5jKSA7Cgl9CgllbHNlCgl7CgkJJHM9c3Vic3RyKCRzb3J0ZWRhcnJheVskY291bnQtMV0sMCwkaW5jKTsKCQlpZigkcyBlcSAkYmFzZSkKCQl7CgkJJHVwcGVybGltaXQ9JGNvdW50OwoJCSRjb3VudCA9ICRsb3dlcmxpbWl0OwoJCSRpbmMrKzsKCQlwcmludCAkaW5jOwoJCWZ1bmMoKTsKCQl9CgkJZWxzZQoJCXsKCQlsYXN0OwoJCX0KCX0KCXByaW50KCJcbiIsJGJhc2UsIiAiLCRtYXRjaCk7CgkkY291bnQrKzsKCWlmKCRiYXNlIG5lICRtYXRjaCkKCQl7CgkJaWYoKCRjb3VudC0xKSA9PSAkbG93ZXJsaW1pdCkKCQkJewoJCQlteSAkbGNvdW50PSRjb3VudDsKCQkJbXkgJHVjb3VudD0kY291bnQrMTsKCQkJaWYoJHVjb3VudD09c2NhbGFyKEBzb3J0ZWRhcnJheSkpCgkJCQl7CgkJCQkkdXBwZXJsaW1pdD0kY291bnQ7CgkJCQkkbWF0PSRpbmMtMTsKCQkJCXNwbGl0dGVyKCk7CgkJCQl9CgkJCWVsc2UKCQkJCXsKCQkJbXkgJHVsaW1pdD0kdXBwZXJsaW1pdDsKCQkJcHJpbnQoIlxuIiwkbGNvdW50LCJcbiIsJHVjb3VudCwiXG4iLCR1bGltaXQpOwoJCQl3aGlsZSgkdWxpbWl0Pj0kY291bnQpCgkJCQkJewoJCQkJbXkgJG5ldz1zdWJzdHIoJHNvcnRlZGFycmF5WyRsY291bnRdLDAsJGluYyk7CgkJCQlwcmludCgiXG4iLCRuZXcpOwoJCQkJbXkgJG5ldzE9c3Vic3RyKCRzb3J0ZWRhcnJheVskdWNvdW50XSwwLCRpbmMpOwoJCQkJcHJpbnQoIiAiLCRuZXcxKTsKCQkJCWlmKCRuZXcgZXEgJG5ldzEpCgkJCQkJCXsKCQkJCQkkdXBwZXJsaW1pdD0kbGNvdW50LTE7CgkJCQkJcHJpbnQoIlxuIiwkdXBwZXJsaW1pdCk7CgkJCQkJJG1hdD0kaW5jLTE7CgkJCQkJcHJpbnQoIlxuIiwkbWF0KTsKCQkJCQlzcGxpdHRlcigpOwoJCQkJCQl9CgkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJJHVsaW1pdC0tOwoJCQkJCSRsY291bnQrKzsKCQkJCQkkdWNvdW50Kys7CgkJCQkJcHJpbnQoIlxuIiwkbGNvdW50LCJcbiIsJHVjb3VudCwiXG4iLCR1bGltaXQpOwoJCQkJCQl9CgkJCQkJfQoJCQkkbWF0PSRpbmMtMTsKCQkJcHJpbnQgJG1hdDsKCQkJc3BsaXR0ZXIoKTsKCQkJCX0KCQkJfQoJCWVsc2UKCQkJewoJCQkkaW5jKys7CgkJCXByaW50ICRpbmM7CgkJCXVubGVzcygoJGNvdW50KSA9PSAkdXBwZXJsaW1pdCkKCQkJCXsKCQkJCSRjb3VudD0kbG93ZXJsaW1pdDsKCQkJCWZ1bmMoKTsKCQkJCX0JCQkJCgkJCX0KCQl9CgllbHNlCgkJewoJCSR1cHBlcmxpbWl0PSRjb3VudDsKCQlmdW5jKCk7CgkJfQp9CmZ1bmMoKTsK