#use strict;
use warnings;
use Time::HiRes;
$|++;
my @lines = <>;
my $n = 50000;
my $long = '';
$long .= qw{( )}[ int(rand() * 2) ] for 1 .. $n;
my @lines2 = @lines;
my $start = Time
::HiRes::time();
my $depth = 40;
my $pre_regex2 = '(?:\((?:\d+,)*(?:\)|' x $depth . '(?!)' . '\)))+' x $depth;
# (?:
# \(
# (?:\d+,)* (?:
# \)
# |
# (?!)\)
# )
# )+
my $regex2 = qr/$pre_regex2/;
my $regex3 = qr/(?:\d+,){2,}/;
for my $string (@lines2){
while (
$a=$&,
$a=~s{\d+,}{$b+=$&,''}eg
, "$b,"
/eg
or
$a=$&,
$b=0,
$a=~s{\d+,}{$b+=$&,''}eg
, "$b,"
/eg
)
{}
my @groups = $string =~ m/\d+/g;
my $max=0;
for my $group (@groups){
$max < $group and $max = $group
}
my $occ = 0;
for my $group (@groups){
$occ += $max == $group
}
$max or $occ=1;
}
$start = Time
::HiRes::time();
my $regex =
\( # match an opening parenthesis
(?0)* # recurse to capture full pattern
\) # match a closing parenthesis
}x;
for my $string (@lines)
{
my $max = 0;
my $occ = 1;
my @groups = ();
my $pred = -1;
my $i = 0;
while ($string =~ m/$regex/g){
$pred == $-[0] or $i++;
$groups[$i] += $+[0] - $-[0];
$pred = $+[0];
}
if (@groups)
{
@groups = sort { $a <=> $b } @groups; $max = $groups[-1];
for my $i (reverse 0 .. $#groups - 1) {
if ( $groups[$i] == $groups[-1])
{
++$occ;
}
else
{
last;
}
}
}
}
__DATA__
)((())))(()())
))(
()(())()
((((()(((
(()())()(())()()())())()((()(()(())()()())((()(())()(()()()()))()(())()(((()())()(()((())()(())(()))
I3VzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKbG9jYWwgJFNJR3tfX1dBUk5fX30gPSBzdWIgeyR3ID0gc2hpZnR9Owp1c2UgVGltZTo6SGlSZXM7CiR8Kys7CgpzcmFuZDsKbXkgQGxpbmVzID0gPD47Cm15ICRuICAgICA9IDUwMDAwOwpteSAkbG9uZyAgPSAnJzsKICAgJGxvbmcgLj0gcXd7KCApfVsgaW50KHJhbmQoKSAqIDIpIF0gZm9yIDEgLi4gJG47CiAgIApwdXNoIEBsaW5lcywgJGxvbmc7CgpteSBAbGluZXMyID0gQGxpbmVzOwoKbXkgJHN0YXJ0ID0gVGltZTo6SGlSZXM6OnRpbWUoKTsKCm15ICRkZXB0aCA9IDQwOwpteSAkcHJlX3JlZ2V4MiA9ICcoPzpcKCg/OlxkKywpKig/OlwpfCcgeCAkZGVwdGggLiAnKD8hKScgLiAnXCkpKSsnIHggJGRlcHRoOwojCSg/OgojCQlcKAojCQkJKD86XGQrLCkqCSg/OgojCQkJCQkJCVwpCiMJCQkJCQkJfAojCQkJCQkJCSg/ISlcKQojCQkJCQkJKQojCSkrCm15ICRyZWdleDIgPSBxci8kcHJlX3JlZ2V4Mi87Cm15ICRyZWdleDMgPSBxci8oPzpcZCssKXsyLH0vOwoKZm9yIG15ICRzdHJpbmcgKEBsaW5lczIpewoJCgl3aGlsZSAoIAoJCSRzdHJpbmcgPX4gcy8kcmVnZXgyLwoJCQkkYT0kJiwKCQkJJGI9KCk9JGE9fm17WykoXX1nLAoJCQkkYT1+c3tcZCssfXskYis9JCYsJyd9ZWcsCgkJCSIkYiwiCgkJCS9lZyAKCQlvcgoJCSRzdHJpbmcgPX4gcy8kcmVnZXgzLwoJCQkkYT0kJiwKCQkJJGI9MCwKCQkJJGE9fnN7XGQrLH17JGIrPSQmLCcnfWVnLAoJCQkiJGIsIgoJCQkvZWcgCgkJKQoJCXt9CglteSBAZ3JvdXBzID0gJHN0cmluZyA9fiBtL1xkKy9nOwoJbXkgJG1heD0wOwoJZm9yIG15ICRncm91cCAoQGdyb3Vwcyl7CgkJJG1heCA8ICRncm91cCBhbmQgJG1heCA9ICRncm91cAoJCX0KCW15ICRvY2MgPSAwOwoJZm9yIG15ICRncm91cCAoQGdyb3Vwcyl7CgkJJG9jYyArPSAkbWF4ID09ICRncm91cAoJCX0KCSRtYXggb3IgJG9jYz0xOwoJcHJpbnQgIiRtYXggJG9jY1xuIjsKCX0KCQpwcmludCBUaW1lOjpIaVJlczo6dGltZSgpIC0gJHN0YXJ0LCAkLzsKCiRzdGFydCA9IFRpbWU6OkhpUmVzOjp0aW1lKCk7CgpteSAkcmVnZXggPQpxcnsKICAgIFwoICAgICAgICAgICAgICAgICAgIyBtYXRjaCBhbiBvcGVuaW5nIHBhcmVudGhlc2lzCiAgICAgICAgICg/MCkqICAgICAgICAgICMgcmVjdXJzZSB0byBjYXB0dXJlIGZ1bGwgcGF0dGVybgogICAgXCkgICAgICAgICAgICAgICAgICAjIG1hdGNoIGEgY2xvc2luZyBwYXJlbnRoZXNpcwp9eDsKCmZvciBteSAkc3RyaW5nIChAbGluZXMpCnsKICAgIG15ICRtYXggICAgPSAwOwogICAgbXkgJG9jYyAgICA9IDE7CiAJbXkgQGdyb3VwcyA9ICgpOwogICAgbXkgJHByZWQgPSAtMTsKICAgIG15ICRpID0gMDsKICAgIHdoaWxlICgkc3RyaW5nID1+IG0vJHJlZ2V4L2cpewogICAgCSRwcmVkID09ICQtWzBdIG9yICRpKys7CiAgICAJJGdyb3Vwc1skaV0gKz0gJCtbMF0gLSAkLVswXTsKICAgIAkkcHJlZCA9ICQrWzBdOwogICAgCX0KCiAgICBpZiAoQGdyb3VwcykKICAgIHsKICAgICAgICBAZ3JvdXBzID0gc29ydCB7ICAgICRhIDw9PiAgICAkYiB9IEBncm91cHM7CiAgICAgICAgJG1heCA9ICAgICRncm91cHNbLTFdOwoKICAgICAgICBmb3IgbXkgJGkgKHJldmVyc2UgMCAuLiAkI2dyb3VwcyAtIDEpCiAgICAgICAgewogICAgICAgICAgICBpZiAoICAgICRncm91cHNbJGldID09ICAgICAkZ3JvdXBzWy0xXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKyskb2NjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwcmludCAiJG1heCAkb2NjXG4iOwp9CgpwcmludCBUaW1lOjpIaVJlczo6dGltZSgpIC0gJHN0YXJ0LCAkLzsKCl9fREFUQV9fCikoKCgpKSkpKCgpKCkpCikpKAooKSgoKSkoKQooKCgoKCkoKCgKKCgpKCkpKCkoKCkpKCkoKSgpKSgpKSgpKCgoKSgoKSgoKSkoKSgpKCkpKCgoKSgoKSkoKSgoKSgpKCkoKSkpKCkoKCkpKCkoKCgoKSgpKSgpKCgpKCgoKSkoKSgoKSkoKCkpKQo=